首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >很多数据库连接jsp

很多数据库连接jsp
EN

Stack Overflow用户
提问于 2014-03-23 01:01:31
回答 1查看 717关注 0票数 0

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

代码语言:javascript
复制
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开始时打开conexion,并在最后关闭conexion,并将所有jsp代码和html放在conexion中,并与数据库建立一个连接?

另一个疑问是,在同样的情况下,如果我要做两个查询,我就喜欢这样:

代码语言:javascript
复制
        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();
        }

所以,我为查询创建了一个新语句,这是蜜源语句吗?或者,如果我在第一个查询中创建语句,是否就足够了?这在页面的速度上很重要吗?

有人知道我能做些什么让我的应用更快吗?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-25 21:33:37

一个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,您的代码至少应该是干净的:

代码语言:javascript
复制
<%
//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表“,后面跟着类似的操作:

代码语言:javascript
复制
while (rs.next()){
  aaa = rs.getObject("aaa").toString();
 }

在SQL中使用WHERE子句将返回的行数限制为1,还将您拉出的字段限制为所需的字段(“从id=1表中选择aaa”),然后是if-语句:

代码语言:javascript
复制
  if (rs.next()){
   aaa = rs.getObject("aaa").toString();
  }

对于当前的代码,每次您再次遍历循环时,aaa都会被一个新的值覆盖。它浪费了大量的处理时间,要么无所事事,要么确保结果是完全错误的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22585733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档