1

oracle-plsql 関数を実行する毎日のバッチ ジョブがあります。実際には、Quartz スケジューラは oracle-plsql 関数を呼び出す Java プログラムを呼び出します。この oracle plsql 関数は、4 つのテーブルからデータ (6 か月以上) を削除し、トランザクションをコミットします。

このバッチ ジョブはテスト環境で正常に実行されていましたが、2 週間前に発生した新しいデータがテーブルにダンプされたときに失敗し始めました (コードは今週実稼働する予定です)。以前は、各テーブルの行数は 10 万以下でした。しかし、今では 3 つのテーブルで 100 万、もう 1 つのテーブルで 240 万です。

3時間実行した後、Javaでエラーが発生しています(ログファイルに書き込まれています)「...接続リセット;ネストされた例外はjava.sql.SQLException:Io例外:接続リセット....」。テーブルの行数を確認したところ、どのテーブルからもレコードが削除されていないことが明らかになりました。

Oracleデータベースで、接続がタイムアウトし、呼び出しセッションがアクティブでなくなったときに、plsqlプロシージャ/関数が自動的に終了/強制終了される可能性はありますか?

前もってありがとう、Pradeep。

4

1 に答える 1

1

PL/SQLは非アクティブであるため終了しません。定義上、そうではないため、まだ何かを実行中です。ただし、クライアントに戻るネットワーク トラフィックは生成されません。

ネットワーク レベルで何かが原因で接続が切断されているようです。これは、リスナーのタイムアウト、ファイアウォールのタイムアウト、またはその他の原因である可能性があります。3 時間後に一貫して発生する場合は、ほぼ確実に、ネットワークの不具合ではなく、どこかで構成されたタイムアウトである可能性が高くなります。これはよりランダムです (そしておそらく回復可能です)。

ネットワーク接続が中断されると、Oracle はある時点でそれを認識し、セッションを終了します。これにより、PL/SQL 呼び出しが終了し、実行されたすべての作業がロールバックされます。これには時間がかかる場合があります。

数百万件のレコードであっても、削除に 3 時間は長いように思えます。おそらく、プロシージャ内に個々の挿入を使用して、非効率的に削除している可能性があります。もちろん、これは本当に役に立ちません。実稼働環境には、接続を切断する設定がないか、タイムアウトが短い可能性があるため、ランタイムを短縮してもライブでの防弾にはならない可能性があることを指摘する価値があるかもしれません. おそらく、タイムアウトの原因を見つけて、ライブ環境で同等のものを確認する必要があります。そこで同様の問題を先取りしようとします。

于 2013-06-18T17:27:10.747 に答える