4

Oracle 11 で jboss7.0.2 final を使用しています。現在、ランダムに発生する 1 つの問題に直面しています。ただし、負荷が高い場合、このエラー トレースは増え続けます。非常に多くのアプローチを試みましたが、成功しませんでした。

MyDatasource 構成:

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

3 に答える 3

5
  1. データベース設定を確認してください。データベースに設定されているタイムアウトがデータソースデプロイメント記述子に設定されているタイムアウトよりも短く、データベースが接続を閉じている可能性があります。

  2. ネットワークを確認してください-ファイアウォール/ルーティング設定に問題があり、接続がルートの途中で閉じられている/切断されている可能性があります。

  3. このリンクJBoss7DatasourceConfigurationをご覧ください。データソース記述子を設定する方法があり、プールからチェックアウトするときに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>
    
于 2012-07-16T09:59:16.443 に答える
3

この問題をどのように修正したかについての簡単な更新。アプリケーションの外部、つまり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 から有効な接続オブジェクトを取得している限り問題ないと思います。

于 2012-07-17T11:21:55.807 に答える
1

接続が失われているようです。ほとんどの場合、これはネットワークに問題がある場合に発生します。使用している構成は少し奇妙です。

idle-timeout-minutes = 41 days , default is 15 minutes
min-pool-size = 1

おそらく、SQLRecoverableExceptionsの原因となるidle-timeout-minutesの場合、次のような構成を使用します。

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で十分です。

于 2012-07-16T09:53:12.280 に答える