java.sql.SQLRecoverableException:关闭连接

新手上路,请多包涵

我在 Oracle 11 中使用 jboss7.0.2 final。目前我面临一个随机发生的问题。但是在重负载期间,此错误跟踪不断增长。尝试了很多方法都无法成功。

我的数据源配置:

 <?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

原文由 satish 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.8k
2 个回答

关于我如何解决此问题的快速更新。我在应用程序之外完成了以下更改,即在 JBOSS 中

**ironjacamar-jdbc**

  1. 在此位置“{JBOSS_HOME_7.0.2}/modules/org/jboss/ironjacamar/jdbcadapters/main/”将 ironjacamar-jdbc jar 从 1.0.3 更新到 1.1.0

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 获取有效的连接对象就可以了。

原文由 satish 发布,翻译遵循 CC BY-SA 3.0 许可协议

  1. 查看您的数据库设置 - 数据库中设置的超时时间可能比数据源部署描述符中设置的超时时间短,并且数据库关闭了连接。

  2. 检查您的网络 - 可能是您的防火墙/路由设置有问题,并且连接在路由中间某处关闭/断开。

  3. 看看这个链接 JBoss 7 Datasource Configuration 。有一种配置数据源描述符的方法,强制 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>

原文由 npe 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏