java.sql.SQLRecoverableException: закрытое соединение
Я использую jboss7.0.2 final с Oracle 11. В настоящее время я сталкиваюсь с одной проблемой, которая происходит случайно. Но во время большой нагрузки эта ошибка продолжает расти. Перепробовал так много подходов не удалось.
MyDatasource Config:
<?xml version="1.0" encoding="UTF-8"?>
<datasource jndi-name="sportPool" pool-name="sportPool" enabled="true" jta="true" use-java-context="true" use-ccm="true">
<connection-url>jdbc:oracle:thin:@10.11.252.200:1521:sportsdb</connection-url>
<driver>oracleDriver</driver>
<pool>
<min-pool-size>1</min-pool-size>
<max-pool-size>75</max-pool-size>
<prefill>false</prefill>
<use-strict-min>false</use-strict-min>
<flush-strategy>FailingConnectionOnly</flush-strategy>
</pool>
<security>
<user-name>mportal</user-name>
<password>mobile</password>
</security>
<timeout>
<idle-timeout-minutes>60000</idle-timeout-minutes>
</timeout>
</datasource>
Трассировки стека:
nested exception is java.sql.SQLRecoverableException: Closed Connection
at org.springframework.jdbc.support.SQLExceptionSubclassTranslator.translate(SQLExceptionSubclassTranslator.java:82)
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.translate(SQLErrorCodeSQLExceptionTranslator.java:237)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:604)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:638)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:667)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:683)
... 50 more
Caused by: java.sql.SQLRecoverableException: Closed Connection
at oracle.jdbc.driver.OracleStatement.ensureOpen(OracleStatement.java:4051)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3563)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3628)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1493)
at org.jboss.jca.adapters.jdbc.CachedPreparedStatement.executeQuery(CachedPreparedStatement.java:111)
at org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.executeQuery(WrappedPreparedStatement.java:462)
at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:645)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:588)
... 56 more
3 ответа
Быстрое обновление о том, как я исправил эту проблему. Я сделал следующие изменения за пределами приложения, то есть в JBOSS
**ironjacamar-jdbc**
Обновлен jar ironjacamar-jdbc с 1.0.3 до 1.1.0 по этому адресу "{JBOSS_HOME_7.0.2}/modules/org/jboss/ironjacamar/jdbcadapters/main/"
Stanalone.xml
По предложению npe добавил <check-valid-connection-sql>
,
<datasource jndi-name="sportPool" pool-name="sptPool" enabled="true" jta="true" use-java-context="true" use-ccm="true">
<connection-url>
jdbc:oracle:thin:@10.11.252.200:1521:sprtsdb
</connection-url>
<driver>
oracleDriver
</driver>
<pool>
<min-pool-size>1</min-pool-size>
<max-pool-size>90</max-pool-size>
<prefill>false</prefill>
<use-strict-min>false</use-strict-min>
<flush-strategy>FailingConnectionOnly</flush-strategy>
</pool>
<security>
<user-name>mtal</user-name>
<password>mle</password>
</security>
<validation>
<check-valid-connection-sql>SELECT 1 FROM DUAL</check-valid-connection-sql>
<validate-on-match>false</validate-on-match>
<background-validation>false</background-validation>
<use-fast-fail>false</use-fast-fail>
</validation>
<timeout>
<idle-timeout-minutes>15</idle-timeout-minutes>
</timeout>
</datasource>
Это решило проблему. Но jboss выводит на консоль предупреждающее сообщение "IJ000612", которое, я думаю, должно быть в порядке, пока приложение получает действительный объект соединения от jboss.
Посмотрите на настройки вашей базы данных - возможно, что тайм-аут, установленный в базе данных, короче, чем тайм-аут, установленный в дескрипторе развертывания источника данных, и база данных закрывает соединения.
Проверьте свою сеть - возможно, что-то не так с настройками брандмауэра / маршрутизации, а соединения закрыты / сброшены где-то в середине маршрута.
Посмотрите по этой ссылке Конфигурация источника данных JBoss 7. Существует способ настройки дескриптора источника данных, заставляющий JBoss проверять соединение при извлечении его из пула. Использовать
valid-connection-checker
(быстрее) илиcheck-valid-connection-sql
(медленнее) и установите<valid-connection-checker> org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker </valid-connection-checker>
или же
<check-valid-connection-sql> SELECT 1 FROM DUAL </check-valid-connection-sql>
Похоже, вы теряете соединение, в большинстве случаев это происходит, когда возникают проблемы с сетью. Конфигурация, которую вы используете, немного странная;
idle-timeout-minutes = 41 days , default is 15 minutes
min-pool-size = 1
вероятно, минуты простоя, вызывающие ваши SQLRecoverableExceptions, я бы использовал конфигурацию вроде;
idle-timeout-minutes = 15 minutes
min-pool-size = 10
max-pool-size = 50 or even less You are using 150MB memory for 75 connections
если у вас нет длительного блокирования соединения с базой данных, то достаточно 20 максимальных размеров пула.