0

クエリの実行中に問題が発生しました。すべてのクエリを実行するために同じresultSetとステートメントを使用します。接続がすでに閉じられていることを示す断続的なSQlExceptionに直面します。次に、クエリごとに個別のresultSetを設定するか、次のようなロックを設定する必要があります。構造。誰もがどちらが良いかわかります。ロックを導入するとプロセスが遅くなると思います。私は正しいですか?

更新:より明確にするために、すべてのクエリが実行される前にfinallyブロックが呼び出され、接続が閉じられて例外がスローされるため、エラーが発生する可能性があります。

これは私が得る例外です

java.sql.SQLException:接続はすでに閉じられています。weblogic.jdbc.wrapper.PoolConnection.checkConnection(PoolConnection.java:81)at weblogic.jdbc.wrapper.ResultSet.preInvocationHandler(ResultSet.java:68)at weblogic.jdbc.wrapper.ResultSet_com_informix_jdbc_IfxResultSet.next(Unknown Source)at com .test.test.execute(test.java:76)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:413)at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:225)at org.apache.struts.action.ActionServlet.process (ActionServlet.java:1858)org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:459)at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)atjavax.servlet.http。 HttpServlet.service(HttpServlet.java:853)at weblogic.servlet.internal.ServletStubImpl $ ServletInvocationAction.run(ServletStubImpl.java:1077)at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:465)at weblogic.servlet .internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:348)(weblogic.servlet.internal.WebAppServletContext $ ServletInvocationAction)。run(WebAppServletContext.java:7047)at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)at weblogic.servlet.internal .WebAppServletContext.invokeServlet(WebAppServletContext.java:3902)at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2773)at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:224)atweblogic.kernel.ExecuteThread。 run(ExecuteThread.java:183)3902)weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2773)at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:224)at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:183)3902)weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2773)at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:224)at 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

4 に答える 4

4

結果セットを再利用していない、結果セットをリークしている。rst = stmt.executeQuery ...は新しい結果セットを生成し、前の結果セットは決して閉じられません:(

于 2009-08-24T11:57:13.223 に答える
1

問題のコードにはマルチスレッド環境で問題があるようです。

DBConnection.getConnection()は、おそらくすべてのスレッドに同じ接続を返しています。複数のスレッドが複数のリクエストを処理している場合、メソッドの実行を終了する最初のスレッドは接続を閉じ、他のすべてのスレッドをハイにして雑多なままにします。

ここで推測していますが、DBConnectionによって返される接続オブジェクトはDBConnectionオブジェクトのインスタンスメンバーであり、マルチスレッド環境の接続マネージャーにとっては悪い習慣と見なされるようです。

コードを修正すると、Connection、Statement(など)、およびResultSetオブジェクトのインスタンスメンバーの使用が回避されます。

于 2009-08-24T13:53:52.410 に答える
0

あなたのコードについてもっと知らなければ、何が起こっているのかわかりません。スレッド化されていますか?基盤となるデータベースがダウンしていますか(またはデータベースへの接続が失われていますか)。

私がすることの1つは、接続プールを実装することです(たとえば、 Apache DBCPを介して)。このフレームワークは、データベースへの接続のプールを維持し、これらの接続を検証してから配布します。クエリ(またはクエリのセット)を作成するたびに新しい接続を要求しますが、それらはプールされているため、これは大きな問題にはなりません。

于 2009-08-24T10:54:43.597 に答える
0

データベースへの接続が実際に閉じられていない限り、次のようなことをしたと思います。

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

このコードは、結果セットが評価される前に実際に接続を閉じ、表示される例外が発生します。

于 2009-08-24T11:25:02.197 に答える