Исключение JDBC-запросов - PullRequest
0 голосов
/ 24 августа 2009

Я сталкиваюсь с проблемой при выполнении запросов. Я использую тот же 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 (Неизвестно Источник) в 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 ]

4 голосов
/ 24 августа 2009

вы не повторно используете набор результатов, вы пропускаете наборы результатов. rst = stmt.executeQuery ... генерирует новый набор результатов, а предыдущий набор никогда не закрывается: (

1 голос
/ 24 августа 2009

Похоже, что данный код имеет проблемы в многопоточной среде.

DBConnection.getConnection (), вероятно, возвращает одинаковое соединение всем потокам. Когда несколько потоков обрабатывают несколько запросов, первый поток, завершивший выполнение метода, закроет соединение, оставив все остальные потоки высокими и разными.

Я размышляю здесь, но похоже, что объект соединения, возвращаемый DBConnection, является членом экземпляра объекта DBConnection, и это может считаться плохой практикой для менеджера соединений в многопоточной среде.

Исправление кода позволит избежать использования элементов экземпляра для объектов Connection, Statement (и т. П.) И ResultSet.

0 голосов
/ 24 августа 2009

Если ваше соединение с базой данных действительно не было закрыто, я думаю, вы сделали что-то вроде этого:

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

Этот код на самом деле закроет соединение до того, как будет оценен ваш набор результатов, в результате вы получите исключение.

0 голосов
/ 24 августа 2009

Я не уверен, что происходит, не зная больше о вашем коде. Это с резьбой? Сбой базы данных (или вы теряете связь с ней).

Одна вещь, которую я хотел бы сделать, это реализовать пул соединений (скажем, через Apache DBCP ). Эта структура будет поддерживать пул соединений с вашей базой данных и проверять этих соединений, прежде чем передать их вам. Вы будете запрашивать новое соединение каждый раз, когда вы делаете запрос (или, возможно, набор запросов), но поскольку они объединены, это не должно быть главной задачей.

...