很多数据库连接jsp

时间:2014-03-23 01:01:32

标签: mysql database jsp web-applications mysql-connector

我使用Spring和Hibernate创建了一个Java Webapp,我必须从数据库中获取大量数据,但是我遇到了问题,因为应用程序太慢了,我需要加快速度。我认为更高的问题是我在每个jsp文件中执行的conosions数量,而且我不知道如何解决它。我认为这些内容都是必要的,但也许我可以修改代码的某些部分以使其更快。我在模型中通过Hibernate和Spring将数据传递给jsp,但是在jsp中我必须与数据库建立连接以获取另一个类中的更多信息。例如,我有一些玩家,并且在玩家中我拥有他们团队的ID,所以我必须在jsp中连接以获取团队的名称,因为我只知道ID。我将向您展示如何将应用程序与数据库连接:

try {
    Class.forName("org.gjt.mm.mysql.Driver");
    Connection conexion = DriverManager.getConnection("jdbc:mysql://localhost:3306/database", "user", "pwd");
    if (!conexion.isClosed()) {
        // La consulta
        Statement st = conexion.createStatement();
        ResultSet rs = st.executeQuery("SELECT * FROM entity");

        while (rs.next()){
            aaa = rs.getObject("aaa").toString();
        }

        // cierre de la conexion
        conexion.close();
    }
    else 
        // Error en la conexion
        out.println("fallo");
}
catch (Exception e) {
    // Error en algun momento.
    out.println("Excepcion "+e);
    e.printStackTrace();
}

我在同一个jsp中做了很多次,甚至在biggers jsp中做了10-15次。 我可以在jsp的开头打开conexion并在最后关闭conexion并将所有jsp代码和html放在conexion中与数据库进行只进行一次连接吗?

还有另一个疑问,在同样的情况下,如果我要做2个查询,我会这样:

        Statement st = conexion.createStatement();
        ResultSet rs = st.executeQuery("SELECT * FROM entity");

        while (rs.next()){
            aaa = rs.getObject("aaa").toString();
        }

        st = conexion.createStatement();
        rs = st.executeQuery("select * from entity2");

        while (rs.next()){
            bbb = rs.getObject("bbb").toString();
        }

所以,我为查询创建了一个新的Statement,它是必要的吗?或者,如果我在第一个查询中创建Statement就足够了?这对页面的速度很重要吗?

有人知道我该怎么做才能让我的应用更快?

谢谢!

1 个答案:

答案 0 :(得分:1)

一个Statement st = conexion.createStatement();就足够了。不要继续重新创建声明。您只能在有限的时间内调用createStatement。如果需要嵌套查询,请创建两个语句st和st2,但不要继续为同一个变量调用createStatement。

此外,如果您要在scriptlet中使用连接,您至少应该创建一个类来放置实际的连接部分,即Class.forName("org.gjt.mm.mysql.Driver"); Connection conexion = DriverManager.getConnection(....);,然后在JSP中调用它。这样你就不会在每个JSP中都有凌乱的连接代码,当你必须更改服务器IP或用户名或其他东西时,你就不必更改大量的JSP。

并且不要在一个JSP中打开连接10次。你甚至不想在Servlet中这样做。您可能希望创建一个Connection类型的成员变量,打开它,并保持打开状态直到结束。

如果您打算使用scriptlet,那么您的代码至少应该是干净的:

<%
//call a static method in a class you create to get the connection
Connection connection = Appname.dbclass.getConnection();
if(connection==null)
{
   out.print("error connecting");
   return;
}
Statement st = connection.createStatement();
ResultSet rs = null;
...
//do all your stuff
...
if(rs!=null)
{
   try
   {
     rs.close();
   }
   catch(Exception ex){}
}
if(st!=null)
{
   try
   {
     st.close();
   }
   catch(Exception ex){}
}
if(connection!=null)
{
   try
   {
     connection.close();
   }
   catch(Exception ex){}
}
%>

此外,不是做“select * from table”,而是执行以下操作:

while (rs.next()){
  aaa = rs.getObject("aaa").toString();
 }

在SQL中使用WHERE CLAUSE来限制返回到ONE的行数,并将您提取的字段限制为所需的字段(“从表WHERE id = 1中选择aaa”)然后使用if语句:

  if (rs.next()){
   aaa = rs.getObject("aaa").toString();
  }

使用您现有的代码,每次再次循环时,aaa都会被新值覆盖。它浪费了大量的处理时间,无论是什么都不做,或者确保结果是完全错误的。