私は、何百ものビジネスユニットから夜間のレポートを受け取るべきサーバーを開発しています。レポートは現在暗号化されたCSVファイルです。合計で、レポートは後日使用するためにデータベースに保存される毎日500,000〜1,000,000レコードになるはずです。同時バッチ処理でJDBC文キャッシュをバイパスする方法はありますか?
私は、送信ごとにPreparedStatementsのセットを作成しました。これらのステートメントは、実行およびコミットする前に50レコードをバッチするために使用されます。各レコードによって最大20個のデータベース挿入が発生する可能性があります。送信がキューに入れられ、1つずつ処理されるとき、すべてがうまくいきます。
これを同時に実行しようとしたところ、別のスレッドがPreparedStatementsのインスタンスと全く同じインスタンスを取得していることに気付きました。これは
- 複数のスレッドは、スレッドのいずれかのデータベースが、それはだ満たしていないときに呼ばれたので
- のコミットを行うための時間だと思ったようだとき
- バッチが実行されたのと同じバッチにステートメントを追加し、次のような問題を引き起こしましたスレッドの一部として制約が文の一部
を使用する時間がなかった質問は次のとおりです。文キャッシュから既存のものを再利用するのではなく、作成するプリペアドステートメントを強制する方法はありますか?
ない
- によってデータベースから
- 落下制約をプールする声明/接続されていないバッチについての個別のデータソースを作成するよりも、状況を処理するための任意のより良い方法がある場合には、注文が
逐次処理を強制的にもう
は、スレッドT1およびT2もありましょう問題を明確にしようとしました。 ステートメントS1とS2を用意しましょう。 バッチB1とB2があるとします。
S1を使用するたびに、B1に追加されます。 S2が使用されるたびに、B2に追加されます。 コミットするとき、S1は外部キー制約ごとにS2の前にコミットされなければなりません。
- T1はT2が無邪気
- T1が
- S1Aを含むT1バッチB2にS2Aを追加文S2を使用して、バッチB1にS1Aを追加文S1を使用して送信を処理
- 嬉々として伝送を処理するとき
問題が発生しますs2aを含む
- T1は、コミットする時刻を決定します。
- T1コミットバッチB1 contai寧S1A
- T2は、T2が
- T1が 'いいえ' と言う
- データベースS2B、S2AをcontaintingバッチB1をコミットS2B、S2Aを含むバッチB2にS2Bを添加S2を使用
- S1Bを含むバッチB1にS1Bを添加S1を使用し外部キーで禁止されているs1bの前にs2bがコミットされているためです。
これは、手動での同期と回答を指摘することで回避できますが、各スレッドのローカルロジックを適用する代わりに、各バッチのサイズを個別に追跡する必要があります。
ベンダー固有の方法を使用して必要な処理を行う必要があります。どのRDBMSで作業していますか? – Juris
Aww。それは本当に私が聞きたかったものではありません。現在、テストシステムはApache Derby上で動作します。本番データベースは、Oracle 10gまたはRのいずれかになります。 –
両方の回答にアップヴォートを付けると、私の問題を考えるのに役立ちます。私がテストしたときに選択したソリューションを提供します。 –