Hibernate 3.6. with JBoss 6.0-Finalリリースを使用しており、データベースはMS-SQL Server 2008です。 LDAPサーバーから従業員データをフェッチしてデータベースに挿入する必要があります。LDAPエントリの数は180,000以上です。 bean管理トランザクションを使用しています。[〜#〜] cmt [〜#〜]トランザクションを使用しているためですneverコミットされます(挿入の量が多いため)。
ロジックは次のとおりです。whileループでは、JPA(Hibernate)を使用してデータベース内のエントリをフェッチおよび作成し続けます。したがって、ステートレスEJB APIの一部として、長い一連のフェッチ作成アクティビティがあります。私はentityManager.flush()/ clear()とトランザクションのコミットを処理後に呼び出しています20ごとレコード。
40,000レコードを挿入した後、JBoss Serevr.logに次の警告メッセージが表示されます。それが本当に警告なのかエラーなのかわからない?
このエラーが発生しましたが、サーバーは引き続き実行され、DBに新しいレコードを挿入し続けます。
私が何か間違ったことをしているのか誰かが提案できますか?または、このエラーの原因は何ですか?
EJBタイムアウトを増やすする方法はありますか?
16:52:49,690 WARN [com.arjuna.ats.arjuna] ARJUNA-12117 TransactionReaper::check timeout for TX 0:ffff105966b8:126a:4db9fc0a:a4 in state RUN
16:52:49,691 WARN [com.arjuna.ats.arjuna] ARJUNA-12121 TransactionReaper::doCancellations worker Thread[Transaction Reaper Worker 0,5,jboss] successfully canceled TX 0:ffff105966b8:126a:4db9fc0a:a4
どんな助けでも大歓迎です。
このWebサイト jbossのトランザクションタイムアウトを変更するためのさらにいくつかの方法を要約します。たとえば、standalone.xml構成ファイルで次のようなサブシステムとして指定できます。
<subsystem xmlns="urn:jboss:domain:transactions:3.0">
<core-environment>
<process-id><uuid/></process-id>
</core-environment>
<recovery-environment socket-binding="txn-recovery-environment" status-socket-binding="txn-status-manager"/>
<coordinator-environment default-timeout="<your timeout value here>"/>
</subsystem>
別の方法として、サブシステム->トランザクション->タイムアウトの下のjboss管理プラットフォームを介してトランザクションタイムアウトパラメータを調整します
多分それは助けになるでしょう。
独自のコメントによると(実際の例を示すため)、トランザクションのタイムアウトを増やす必要がある場合は、トランザクションの境界を定義するクラスのメソッドにアノテーションを使用できます(通常は「ファサード」の実装)。
たとえば、org.springframework.transaction.annotation.Transactional
を使用します
@Transactional(timeout = 600) // value is in seconds
これは、日常の本番コードではなく1回限りのデータ変換タスクに必要なように思われるため、タイムアウトを増やすことはおそらく正当化されます。それ以外の場合は、処理を小さなチャンクにバッチ処理し、それぞれをシステムのデフォルトのタイムアウト内に完了すると予想される一意のトランザクションにすることを検討する価値があります。