Java JDBC查询执行

Java JDBC查询执行,java,jdbc,connection,resultset,Java,Jdbc,Connection,Resultset,我在执行查询时遇到了一个问题。我使用相同的resultSet和语句来执行所有查询。现在我遇到一个断断续续的SQlException,说连接已经关闭。现在我们必须为每个查询使用单独的resultSet,或者使用类似锁的结构。谁能告诉我哪个更好?我想引入锁会减慢进程,对吗 更新: 更清楚地说,发生错误的原因可能是在执行所有查询之前调用了finally块,连接关闭,异常将被抛出 这是我得到的例外 java.sql.SQLException:连接已断开 已经关闭了。在 weblogic.jdbc.wra

我在执行查询时遇到了一个问题。我使用相同的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\u com\u informix\u jdbc\u IfxResultSet.next(未知 来源)在 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) 在 javaservlet.http.HttpServlet.service(HttpServlet.java:760) 在 javaservlet.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 
} 

如果不了解更多有关代码的信息,我不确定发生了什么。是螺纹的吗?基础数据库是否正在关闭(或者您是否正在失去与它的连接)


我要做的一件事是实现连接池(比如说,通过)。这个框架将维护到数据库的连接池,并在将这些连接分发给您之前验证它们。每次进行查询(或者可能是一组查询)时,您都会请求一个新连接,但因为它们是池式的,所以这不应该是一个重大问题。

如果不了解更多代码,我不确定发生了什么。是螺纹的吗?基础数据库是否正在关闭(或者您是否正在失去与它的连接)


我要做的一件事是实现连接池(比如说,通过)。这个框架将维护到数据库的连接池,并在将这些连接分发给您之前验证它们。每次进行查询(或者可能是一组查询)时,您都会要求建立一个新连接,但因为它们是池式的,所以这不应该是一个大问题。

除非您与数据库的连接真的被关闭,否则我想您做了类似的事情:

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

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

除非您与数据库的连接确实已关闭,否则我认为您执行了类似操作:

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

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

您没有重用结果集,而是泄漏了结果集。
rst=stmt.executeQuery。。。生成新的结果集,而以前的结果集从未关闭:(

您没有重用结果集,您正在泄漏结果集。
rst=stmt.executeQuery…生成一个新的结果集,而以前的结果集从未关闭:(

在多线程环境中,相关代码似乎存在问题

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

我在这里猜测,但是DBConnection返回的connection对象似乎是DBConnection对象的实例成员,这对于多线程环境中的连接管理器来说是一种不好的做法


代码修复将避免将实例成员用于连接、语句(等)和结果集对象。

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

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

我在这里猜测,但是DBConnection返回的connection对象似乎是DBConnection对象的实例成员,这对于多线程环境中的连接管理器来说是一种不好的做法


代码修复将避免对连接、语句等使用实例成员,和ResultSet对象。

否,它没有线程化。我使用的是单个连接、ResultSet和语句。我对每个查询使用相同的语句和ResultSet。如何使用相同的ResultSet?您的意思是对每个查询使用相同的代码