java.sql.Exception ClosedConnection - PullRequest
       8

java.sql.Exception ClosedConnection

2 голосов
/ 07 июня 2010

Я получаю следующую ошибку:

java.sql.SQLException: закрытое соединение в oracle.jdbc.driver.DatabaseError.throwSqlException (DatabaseError.java:112) в oracle.jdbc.driver.DatabaseError.throwSqlException (DatabaseError.java:146) по адресу oracle.jdbc.driver.DatabaseError.throwSqlException (DatabaseError.java:208) по адресу oracle.jdbc.driver.PhysicalConnection.getMetaData (PhysicalConneatis).sqlmap.engine.execution.SqlExecutor.moveToNextResultsSafely (SqlExecutor.java:348) в com.ibatis.sqlmap.engine.execution.SqlExecutor.handleMultipleResults (SqlExecutor.java:320 ).sql.ql.executeQueryProcedure (SqlExecutor.java:277) по адресу com.ibatis.sqlmap.engine.mapping.statement.ProcedureStatement.sqlExecuteQuery (ПроцедураJava: 173) на com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForList (GeneralStatement.java:123) по адресу com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList (SqlMapExecutorDelegate.java:614) по адресу com.ibatis.sqlmap.engine.impl.SqlMapExjeryDelegatelDelegDelegв com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList (SqlMapSessionImpl.java:118) в org.springframework.orm.ibatis.SqlMapClientTemplateSqlMapClientTemplate.execute (SqlMapClientTemplate.java:193) в org.springframework.orm.ibatis.SqlMapClientTemplate.executeWithListResult (SqlMapClientTemplate.java.hud.pih.eiv.web.authentication.AuthenticationUserDAO.isPihUserDAO (AuthenticationUserDAO.java:24) в gov.hud.pih.eiv.web.authorization.AuthorizationProxy.isAuthorized (AuthorizationProxy.java:125) в gh.h.eiv.web.authorization.AuthorizationFilter.doFilter (AuthorizationFilter.java:224) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:246) в

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

У нас есть хранимые процедуры, которые выполняются в течение длительного времени, прежде чем они возвращают результаты (около 15 секунд).

Есть ли у кого-нибудь идеи о том, что может быть причиной этого?Я не думаю, что повышение количества соединений на сервере приложений решит эту проблему, потому что если соединения заканчиваются, мы увидим «Ошибка при распределении соединений»

Пример кода:

this.setSqlMapClientTemplate(getSqlTempl());
getSqlMapClientTemplate().queryForList("authentication.isUserDAO", parmMap);
this.setSqlMapClientTemplate(getSqlTemplDW());
List results = (List) parmMap.get("Result0");

Я использую validate в моем пуле соединений.

Ответы [ 3 ]

0 голосов
/ 07 июня 2010

Какая у вас структура DataSource? Apache Commons DBCP? Вы используете свойство poolPrepareStatement в конфигурации источника данных?

Проверьте следующее:

  1. Убедитесь, что testOnBorrow и testOnReturn имеют значение true, и поместите простой валидационный запрос, такой как select 0 from dual. Вы используете au
  2. вы используете autoCommit? Используете ли вы START TRANSACTION, COMMIT в своих хранимых процедурах? После нескольких дней отладки мы обнаружили, что вы не можете смешивать управление транзакциями как в Java, так и в SQL - вам нужно выбрать одно место для этого. Где ты делаешь свое?

Отредактируйте свой вопрос с ответами на него, и мы продолжим оттуда.

0 голосов
/ 07 июня 2010

Когда сервер БД перезагружается или возникают проблемы с сетью, все соединения в пуле соединений разрываются, и для этого обычно требуется перезагрузка сервера приложений

И если обнаружено разорванное соединение, вы должны создать новое, чтобы заменить его в пуле соединений. Это общая проблема, называемая смертельными соединениями.

0 голосов
/ 07 июня 2010

Основываясь на трассировке стека, вероятной причиной является то, что вы продолжаете использовать ResultSet после вызова close () для Соединения, которое сгенерировало ResultSet.

...