Fóruns: Open Discussion (Thread #21389)

【バッチFW】非同期ジョブ起動でジョブ管理テーブルの競合発生 (2009-01-21 13:12 by Anônimo #41358)

いつもお世話になっております。
夜間の大量帳票作成処理でテラソルナを利用させて頂いております。
現在、以下問題が発生しており、
事象の発生原因、及び対応策についてアドバイス頂ければと存じます。

【事象】
非同期ジョブを起動すると、ジョブ管理テーブルの排他ロック解放待ち(ブロッキング発生)に
なってしまい処理が停止する。
DBのSQLトレースから確認すると、ジョブ管理テーブルのステータスを0から1へ変更するプロセスが
コミットを発行しておらず(ジョブ管理テーブルの更新トランザクションが閉じていない状態)、
各帳票作成プロセスが処理終了時にステータスを1から3へ変更するSQLで待ちとなっている状態。

【発生するケース】
ジョブ管理テーブルの一行が一つの帳票作成処理であり、この件数がキューサイズを超えた場合に、
事象が発生する模様。

作成した帳票数は「54」であったため、queueLengthを「10」から「60」へ変更したところ、
事象は発生しなかったことからテラソルナ本体がジョブ管理テーブルのステータスを
0から1へ変更する処理が2回以上に渡る場合に発生する可能性があると推測した。

尚、各帳票作成処理においては、BLogicのexecuteメソッドをオーバーライドし、
その中で帳票作成に必要なSQLをテラソルナのDAO経由で発行している。

【試行】
設定ファイルの変更を以下の通り行い、事象の発生有無を確認する予定です。
結果については別途フォーラムに投稿させて頂きます。

(1)AutoCommit
変更前:false
変更後:true

(2)トランザクションモデル
変更前:全チャンク単一トランザクション
変更後:チャンク別トランザクション

Responder a #41358×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: 【バッチFW】非同期ジョブ起動でジョブ管理テーブルの競合発生 (2009-01-21 17:59 by kuramotoki #41373)

非同期バッチデーモンのコレクタは、
ステータス変更後にキューイングに成功した時点でコミットを発行する手順
(ジョブ依頼情報取得⇒キューイング⇒コミットとなっており、
コレクタはキューイングできるまで処理を待ちます)
となっています。
コレクタ内の処理ではロックをかけていません。
そのため、DBが行ロックに対応していない場合は下記の事象が発生すると思われます。

使用しているDBは何でしょうか?
Responder a #41358

Responder a #41373×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: 【バッチFW】非同期ジョブ起動でジョブ管理テーブルの競合発生 (2009-01-21 21:35 by Anônimo #41378)

早速の返信ありがとうございます。

使用しているDBはSQLServer2005SP2です。

内容について以下確認させてください。

-----------------------------------------
(1)
「非同期バッチデーモンのコレクタ」とはトランザクション管理テーブルの
ステータスをを0から1へ変更するコレクタのことでしょうか?
-----------------------------------------
(2)
トランザクション管理テーブルの競合が発生するフローは以下の
認識で合ってますでしょうか?
上から処理順に記載しております。


1.コレクタがトランザクションを開始する

2.コレクタがジョブ管理テーブルからデータを読込み、ジョブオブジェクトを作成する

3.コレクタがジョブ管理テーブルの処理対象データのステータスを0から1へ更新する

4.コレクタがジョブキューへジョブオブジェクトを登録しようとするが空きがないため待ちとなる
  →ジョブキューへの登録が完了しないとCommitされないためトランザクションはOpenのまま

5.ジョブ実行が完了したワーカーがジョブ管理テーブルのステータスを1から3へ更新する

6.ジョブ実行が完了したワーカーはコレクタのトランザクションが完了するまで待ちとなる
  →1から3までの処理でジョブ管理テーブルに対してページロックがかかっているため

この結果、ジョブ管理テーブルに対して4と6の競合が発生し、処理が停止してしまう。
SQLServerとしてはプログラム側からコミット命令が届いていないだけであり、
ただの処理待ちであると判断する(DeadLockとは判断しない)。
-----------------------------------------


今件に対する対応ですが、以下のいずれかを考えております。
こちらの認識違いなどありましたらご指摘ください。

【対応1】
SQLServer2005を行ロックモードで実行する

ロックエスカレーションが発生しないためジョブ管理テーブルの競合が発生しなくなる

【対応2】
ジョブキューのサイズをジョブ管理テーブルのレコード数以上にする

コレクタによるジョブキューへの登録が初回のみとなるため、
2回目以降の登録待ちが発生しなくなりジョブ管理テーブルの競合が発生しなくなる


また、対応2を採用するにあたり、ジョブキューのサイズの上限値
(いくつまで設定することが可能であるか)を教えてください。


以上
Responder a #41373

Responder a #41378×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: 【バッチFW】非同期ジョブ起動でジョブ管理テーブルの競合発生 (2009-01-22 15:11 by kuramotoki #41394)

(1)について
そのとおりです。

(2)について
競合発生のフローについてはご認識の通りで正しいです。
また、ご提示いただいた対応1、2のどちらでも対応できると
考えておりますが対応案1の方が良いかと考えます。

対応案2についてですが、
キューの長さは理論的にはInteger.MAX_VALUE()まで設定できますが、
現実的には一度に登録するジョブの個数より少し大きい値を設定していただければ
と思います。(今回のケースでは60で良いと思います)
ただし、対応案2を採用するに当たっては考慮しておく点があり、
STOPレコードにより非同期バッチデーモンを停止するには
すでにキューにputされているジョブをすべて実行する必要があるので、
急遽デーモンを停止するような場合にすぐ停止できなくなります。
Responder a #41358

Responder a #41394×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: 【バッチFW】非同期ジョブ起動でジョブ管理テーブルの競合発生 (2009-01-22 18:37 by Anônimo #41399)

ご回答ありがとうございました。
大変助かりました。

対応についてはアドバイス頂いた内容を参考に決定したいと思います。

以上
Responder a #41394

Responder a #41399×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: 【バッチFW】非同期ジョブ起動でジョブ管理テーブルの競合発生 (2009-02-24 16:35 by Anônimo #42113)

お世話になっております。

他の記事を参考にし、キューサイズを変更してみることにしました。
次の設定が関連すると思われます。

/batchapps/template/NoTransactionBean.xml
<!-- ===================== マネージャ定義 ===================== -->
<!-- 一段目のマネージャ -->
<bean id="jobManager" parent="baseManager">
<property name="name" value="noTransactionJobManager" />
<property name="collector" ref="collector" />
<property name="workQueueFactory">
<bean class="${workQueueFactory.class}">
<property name="workerExecutorService" ref="workerExecutorService" />
<property name="queueLength" ref="chunkQueueLength" />■

■/batchapps/common/DefaultValueBean.xml
<!-- チャンクキューサイズ -->
<bean id="chunkQueueLength" class="java.lang.Integer">
<!-- 10 → 100 -->
<constructor-arg value="100" />●
</bean>

以下は、queueLength をキーにして検索しましたが、同様に変更する必要のあるものか
教えてもらえませんでしょうか?

/batchapps/common/AsyncBatchDaemonForCommonjBean.xml

<!-- 非同期バッチ起動用のマネージャ -->
<bean id="jobManager" parent="baseManager">
<property name="name" value="AsyncBatchDaemonManager" />
<property name="collector" ref="batchDaemonJobCollector" />
<property name="workQueueFactory">
<bean class="${workQueueFactory.class}">
<property name="workerExecutorService" ref="workerExecutorService" />
<property name="queueProcessor" ref="asyncBatchDaemonQueueProcessor" />
<property name="queueLength" value="10" />●

/batchapps/common/AsyncBatchDaemonBean.xml

<!-- ===================== マネージャ定義 ===================== -->
<!-- 非同期バッチ起動用のマネージャ -->
<bean id="jobManager" parent="baseManager">
<property name="name" value="AsyncBatchDaemonManager" />
<property name="collector" ref="batchDaemonJobCollector" />
<property name="workQueueFactory">
<bean class="jp.terasoluna.fw.batch.standard.StandardWorkQueueFactory">
<property name="workerExecutorService" ref="workerExecutorService" />
<property name="queueProcessor" ref="asyncBatchDaemonQueueProcessor" />
<property name="queueLength" value="10" />●
Responder a #41358

Responder a #42113×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: 【バッチFW】非同期ジョブ起動でジョブ管理テーブルの競合発生 (2009-02-24 16:37 by Anônimo #42114)

申し訳ありません。投稿するスレッドを間違えました。
Responder a #42113

Responder a #42114×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login