1

おそらくこの質問はあまり明確ではありませんが、私がすぐに対処したい問題を説明する見出しのためのより良い言葉を見つけられませんでした。

Javaデスクトップアプリケーションからpostgresへのアクセスを制限したい。

背景:

2つのアプリを実行していて、最初のアプリケーションがデータベース内のデータに基づいて複雑な計算を実行する必要があるとします。データベース内のデータの不変性を明確にするために、挿入、更新、および削除操作のためにデータベースをロックしたいと思います。クライアント側では、この動作を十分に処理することは不可能だと思います。そこで、プロキシのように機能する小さなjava-appをサーバー側で使用することを考えました。したがって、タスクは、ロックするコマンドを取得するまでCRUD(Create Read Update Delete)操作を引き渡すことです。ロック後、ロックしているクライアントからロック解除コマンドを取得するか、タイムアウトに達するまで、すべてのCUD操作を拒否します。

質問:

このアプローチについてどう思いますか?

このようなアプローチを使用しているときにデータベースをロックすることは可能ですか?

サーバー側のJavaアプリとしてJavaSEまたはJavaEEのどちらを使用しますか?

前もって感謝します。

4

3 に答える 3

3

オペレーションでトランザクションを使用してみませんか?データベースには、データベース全体のロックなどの野蛮な操作に頼るのではなく、データの整合性自体を維持する機能があります。

あなたが説明するこのロックメカニズムは、ユーザーにとって苦痛のように聞こえます。ユーザーはロックを開始していますか、それともソフトウェア自体ですか?ユーザーの場合、ボブがロックを押してから2時間昼食に行き、最初にデータベースのロックを解除するのを忘れると、いくつかの問題が発生する可能性があります...

于 2008-10-23T16:50:47.110 に答える
1

確かに...この問題に対処する適切な方法がいくつかあります。

  1. コード内のテーブルをロックするだけです。Postgresql には、クライアント アプリケーションから実行できるテーブル全体をロックするためのコマンドがあります。
  2. txn の開始後にコミットされたデータの読み取りの問題がないトランザクション分離レベルを選択します (BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ)。

これらのうち、断然最も効率的なのは、分離レベルとして反復可能読み取りを使用することです。Postgres はこれを非常に効率的にサポートしており、db をそれほど頻繁にロックすることなく、データの一貫したビューを提供します。

于 2008-10-23T19:26:58.713 に答える
0

取引を考えた年ですが、今回は使えません。申し訳ありませんが、正確には言及していません。したがって、次の簡単なケースを想定します。計算によって1つの責任領域が閉じられます。計算後、新しいインサートが開かれ、新しいインサートが専用になります。ただし、計算プロセス中は、(現在計算されている)責任範囲のデータに対して挿入、更新、または削除を行うことはできません。データをアーカイブする必要があるため、削除を超えることは固く禁じられています。

したがって、トランザクションの使用はこの要件に適合しません。または私はsthを逃しましたか?

ps :(トピック外)@jsight:私は現在、postgresのmappsを「repeatableread」から「serializable」に変更することを読んでいるので、「repeatable read」を使用すると、おそらく予想よりも制限が厳しくなります。

于 2008-10-24T08:59:57.730 に答える