4

私の Java webapp では、データベースが JDBC 接続を介して最新であるかどうか、各インスタンスが起動時にチェックしています。DB が最新でない場合、SQL スクリプトを実行して更新ルーチンを実行します。

インスタンスが起動するタイミングを制御できません。したがって、データベースの更新を同時に実行するインスタンスが 1 つだけであることを確認する必要があります。理想的には、データベース全体をロックする必要がありますが、

http://www.postgresql.org/docs/8.4/static/explicit-locking.html

http://wiki.postgresql.org/wiki/Lock_database

PostgreSQL はそれをサポートしていません (私はまだバージョン 8.4 を使用しています)。

他にどのようなオプションがありますか?

4

2 に答える 2

4

すべてのインスタンスのコードを制御する場合は、データベースにテーブルを作成して、開始する各インスタンスがこのテーブルでタイムスタンプ付きのレコードを探すことができます。それをあなたの「ロック」レコードと呼びましょう。

プロセスがロックレコードが存在しないことを検出すると、プロセスはレコードを挿入し、必要なデータを処理します。

プロセスがロックレコードが存在することを検出した場合、別のプロセスがロックレコードを作成し、何もしない、ビジーウェイトなどを行うと想定できます。

この設計を使用すると、プロセスを同期するための「ロック」をデータベースに効果的に作成できます。あなたはそれをコーディングするので、すべてのプロセスはそれらがロックレコードのロジックに従わなければならないことを知っています。

ロックを持つ最初のプロセスが処理を完了すると、次の再起動が正しく動作するように、ロックレコードをクリアする必要があります。また、サーバーエラーや実行エラーが原因でロックが解除されていない状況についても考慮する必要があります。通常、ロックが数n分より古い場合は、「古くなっている」と見なすことができるため、ロックを削除して、再度作成します(または単に更新します)。

「ロック」レコードを処理するときは、原子性を保証するために、DB接続でシリアル化可能な分離レベルを使用してください。

Javaコードのサービス層は、データアクセス層を呼び出す前にロック戦略を適用できます。これは単なるアプリケーションロジックであるため、Hibernateを使用するかどうかは関係ありません。

于 2012-09-06T13:46:49.763 に答える
0

理想的には、データベース全体をロックする必要があります。

アクセスを効果的にシリアル化している限り、ロックが何に適用されるかは本当に重要ですか?任意のテーブルまたは行の排他ロックを取得するだけです。

于 2012-09-06T13:46:50.907 に答える