JDBC查询执行

时间:2009-08-24 10:43:38

标签: java jdbc connection resultset

我在执行查询时遇到问题。我使用相同的resultSet和语句来排除所有查询。现在我遇到间歇性的SQlException,说连接已经关闭。现在我们必须为每个查询分别使用resultSet或者有锁定的结构。任何人都可以告诉哪个更好。我认为引入锁会减慢这个过程。我是对的吗?

更新: 更清楚。可能会发生错误,因为在执行所有查询之前调用finally块并且连接被关闭并且将抛出异常。

这是我得到的例外

  

java.sql.SQLException:连接有   已经关闭了。在   weblogic.jdbc.wrapper.PoolConnection.checkConnection(PoolConnection.java:81)     在   weblogic.jdbc.wrapper.ResultSet.preInvocationHandler(ResultSet.java:68)     在   weblogic.jdbc.wrapper.ResultSet_com_informix_jdbc_IfxResultSet.next(未知   来源)at   com.test.test.execute(test.java:76)
    在   org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:413)     在   org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:225)     在   org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858)     在   org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:459)     在   javax.servlet.http.HttpServlet.service(HttpServlet.java:760)     在   javax.servlet.http.HttpServlet.service(HttpServlet.java:853)     在   weblogic.servlet.internal.ServletStubImpl $ ServletInvocationAction.run(ServletStubImpl.java:1077)     在   weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:465)     在   weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:348)     在   weblogic.servlet.internal.WebAppServletContext $ ServletInvocationAction.run(WebAppServletContext.java:7047)     在   weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)     在   weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)     在   weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3902)     在   weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2773)     在   weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:224)     在   weblogic.kernel.ExecuteThread.run(ExecuteThread.java:183)

示例代码:

ResultSet rst=null; 
Statement stmt=null; 
Connection con=DBConnection.getConnection();
 stmt=con.createStatement();
 rst=stmt.executeQuery("select * from dual");
 while(rst.next())
 { : ://Some code } 
rst=stmt.executeQuery("select * from doctor where degree="BM");
 while(rst.next())
 { //blah blah } 
finally
 { 
//close con,rst and stmt 
} 

4 个答案:

答案 0 :(得分:3)

你没有重用结果集,你正在泄漏结果集。 rst = stmt.executeQuery ...生成一个新的结果集,并且以前的结果集永远不会关闭:(

答案 1 :(得分:1)

似乎有问题的代码在多线程环境中存在问题。

DBConnection.getConnection()可能返回与所有线程相同的连接。当多个线程正在处理多个请求时,完成该方法执行的第一个线程将关闭连接,使所有其他线程保持高位杂乱。

我在这里推测,但似乎DBConnection返回的连接对象是DBConnection对象的实例成员,并且这将成为多线程环境中连接管理器的错误做法。

代码修复将避免使用Connection,Statement(等)和ResultSet对象的实例成员。

答案 2 :(得分:0)

如果不了解您的代码,我不确定会发生什么。有线程吗?底层数据库是否正在关闭(或者您正在失去与它的连接)。

我要做的一件事是实现连接池(通过Apache DBCP,比方说)。此框架将维护一个与您的数据库的连接池,并验证这些连接,然后再将它们发送给您。每次进行查询(或者可能是一组查询)时,您都会要求新的连接,但因为它们被合并,所以这不应该是一个主要的oeverhead。

答案 3 :(得分:0)

除非您与数据库的连接确实已关闭,否则我认为您做了类似的事情:

try {
    return resultSet.getBoolean("SUCCESS");
} finally {
    resultSet.close();
}

此代码实际上会在评估结果集之前关闭连接,从而导致显示异常。