1

100000の行を含むDBで数百の行を選択し、後でそれらの行を更新しようとしています。

問題は、updateがそれらの行を「読み取り」としてマークするだけなので、この目的でDBに2回アクセスしたくないことです。

単純なjdbcライブラリを使用してJavaでこれを行う方法はありますか?(うまくいけば、ストアドプロシージャを使用せずに)

更新:わかりました、ここにいくつかの説明があります。

異なるサーバーで実行されている同じアプリケーションのインスタンスがいくつかあります。それらはすべて、creation_date列に従ってソートされた数百の「UNREAD」行を選択し、その中のblobデータを読み取り、ファイルに書き込み、そのファイルをサーバーにftpで転送する必要があります。(私は先史時代を知っていますが、要件は要件です)

読み取りと更新の部分は、各インスタンスが異なるデータセットを取得することを保証するためのものです。(順番に、オッズや偶数のようなトリックは機能しません:/)

更新するデータを選択します。データはネットワークを介して転送され(待機して待機)、「READ」として更新されます。次に、読み取りのためにロックを解除します。この全体に時間がかかりすぎます。読み取りと更新を同時に行うことで、ロック時間を短縮して(更新にselectを使用してから実際の更新まで)、複数のインスタンスを使用すると1秒あたりの読み取り行が増えるようにしたいと思います。

まだアイデアがありますか?

4

4 に答える 4

2

ここでの質問を解釈するには、複数の方法があるように思えます。

  1. 行を読み取るのではなく、更新するという唯一の目的で行を選択しています。
  2. 誰かに表示する行を選択し、それらを一度に 1 つずつ、またはグループとしてすべて既読としてマークしています。
  3. 行を選択し、選択した時点で既読としてマークする必要があります。

それが最も簡単に思えるので、最初にオプション 1 を採用しましょう。行を更新するために行を選択する必要はありません。WHERE 句を使用して更新を発行するだけです。

update table_x
set read = 'T'
where date > sysdate-1;

オプション 2 を見ると、ユーザーがそれらを読んだとき (または下流のシステムがそれを受け取ったときなど) に、それらを既読としてマークしたいと考えています。このためには、おそらく別の更新を行う必要があります。最初の選択で必要な他の列に加えて、主キーを照会する場合、DB が行を見つけるためにテーブルまたはインデックスのスキャンを実行する必要がないため、おそらく更新が簡単になります。 .

JDBC (Java) には、一連の更新を一度に実行するバッチ更新を行う機能があります。まったく同じ形式の多くの更新を実行する必要がある場合、これはうまく機能します。

オプション 3 では、すべてを 1 回で選択して更新します。個人的には、これはあまり役に立ちませんが、他の人がそうでないというわけではありません。ある種のストアド プロシージャが往復を減らすと思います。ここで作業しているデータベースがわからないため、詳細を提供することはできません。

于 2009-01-03T21:57:40.983 に答える
1

DBに行くことはそれほど悪くはありません。「ネットワークを介して」何も返さない場合は、更新によって大きなダメージが発生することはなく、数十万行しか返されません。あなたの心配は何ですか?

于 2009-01-03T21:25:01.113 に答える
1

JDBC で SELECT を実行し、ResultSet を繰り返し処理して各行を UPDATE する場合、それは間違っています。これは (n+1) クエリの問題であり、決してうまく機能しません。

どの行を更新する必要があるかを決定する WHERE 句を使用して UPDATE を実行するだけです。その方法は、単一のネットワーク往復です。

コード中心になりすぎないでください。データベースが設計された仕事をするようにしましょう。

于 2009-01-03T21:41:45.417 に答える
0

閉じずに同じ接続を使用することはできませんか?

于 2009-01-03T21:20:33.010 に答える