2

Seam 2.2.2、JBoss 5.1、MySQL 5.1.5.1、MySQL JDBC コネクタ 5.1.12、および非同期メソッド (Quartz を使用) と pojo で奇妙な動作をします。

さまざまなタスク用に 10 個の非同期スレッドのプールがあります。それらは通常正常に動作し、db クエリや更新などを実行します。1 つの非同期メソッドで例外が発生した場合、同じスレッドから呼び出される次の非同期メソッドには影響しません。

しかし、特定のスレッドでこの例外が発生するケースが 1 つあります。

    012-10-02 05:45:26,743 WARN  [][JDBCExceptionReporter] (er-4) SQL Error: 0, SQLState: null
2012-10-02 05:45:26,743 ERROR [][JDBCExceptionReporter] (er-4) Transaction is not active: tx=TransactionImple < ac, BasicAction: 7f000001:b824:5069f752:15d status: ActionStatus.ABORT_ONLY >; - nested throwable: (javax.resource.ResourceException: Transaction is not active: tx=TransactionImple < ac, BasicAction: 7f000001:b824:5069f752:15d status: ActionStatus.ABORT_ONLY >)
2012-10-02 05:45:26,743 INFO  [][DefaultLoadEventListener] (er-4) Error performing load command
org.hibernate.exception.GenericJDBCException: Cannot open connection
        at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126)
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52)
        at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:449)
        at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
        at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161)
        at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1573)

その後、このスレッド (er-4) が使用され、クエリが実行されるたびに、同じ例外が発生します。どうすればこれから回復できますか?また、その理由は何ですか? このスレッドによってどのメソッドが呼び出されても (@Transactional で注釈が付けられています)、GenericJDBCException: Cannot open connection が原因ですべて失敗します。問題は突然突然現れました。

私はdb接続プールを使用しており、使用する前に接続を検証しています(デプロイメント記述子から):

  <!--pooling parameters-->
       <min-pool-size>5</min-pool-size>
       <max-pool-size>100</max-pool-size>
       <blocking-timeout-millis>5000</blocking-timeout-millis>
       <idle-timeout-minutes>15</idle-timeout-minutes>
       <prepared-statement-cache-size>50</prepared-statement-cache-size>
       <check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>

これは私のコードに問題がありますか? シームと?JBoss? MySQL? JDBC MySQL ドライバー?

他の誰かが同様の問題を経験しましたか。

4

2 に答える 2

2

この問題は、バッチ処理を行うメソッドが原因でした。UserTransaction を直接処理しましたが、例外は処理しませんでした。

例えば

UserTransaction userTx = null;
    try{
        log.info("Updating List from #0 on", startAt);

    userTx = (UserTransaction) org.jboss.seam.Component.getInstance("org.jboss.seam.transaction.transaction");
      userTx.setTransactionTimeout(10 * 60);  //set timeout to 60 * 60 = 3600 secs = 1 h
      userTx.begin();

      /*If entity manager is created before the transaction is started (ie. via Injection) then it must join the transaction */
      entityManager.joinTransaction();
    //DO STUFF
    userTx.commit();
    }catch(Exception e){
        e.printStackTrace();
        return false;
    }

catch ステートメントには userTx.rollback() が含まれている必要があります。そうしないと、そのスレッドのトランザクションは使用できない状態のままになります。

于 2014-12-09T16:00:18.797 に答える
0

接続が一定時間 (例: 8 時間) アイドル状態でしたか?

MySQL は 8 時間後に TCP 接続をドロップします (デフォルトでは、構成可能です)。

再接続ロジックを実装する必要があります。

于 2012-10-03T09:04:49.687 に答える