大量的数据库连接jsp



我用Spring和Hibernate做了一个Java web应用程序,我必须从数据库中获取大量数据,但我有一个问题,因为应用程序太慢,我需要使它更快。我认为更大的问题是我在每个jsp文件中执行的条件的数量,而我不知道如何解决它。我认为这些条件都是必要的,但也许我可以修改代码的某些部分,使其更快。我通过模型中的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中做了很多次,甚至在更大的jsp中做了10-15次。我可以在jsp的开头打开conconsion并在结尾关闭conconsion,并将所有jsp代码和html放入与数据库的conconsion中,以便仅进行1次连接吗?

另一个疑问是,在相同的连接中,如果我必须执行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 st = conexion.createStatement();就足够了。不要重复陈述。您可以调用createstatstatement的次数有限。如果您需要一个嵌套查询,创建两个语句,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子句来限制返回到ONE的行数,并限制您需要的字段("select aaa from table WHERE id=1"),然后使用if语句:

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

对于当前的代码,每次再次执行循环时,aaa都会被一个新值覆盖。它浪费了大量的处理时间,要么什么都不做,要么确保结果完全错误。

最新更新