4

私はJDBCを使用しています。値の変化に対してデータベースを常にチェックする必要があります。

私が現在持っているのは、実行中の無限ループ、変化する値を反復する内部ループ、およびデータベースに対する各反復チェックです。

public void runInBG() { //this method called from another thread
    while(true) {
     while(els.hasElements()) {
      Test el = (Test)els.next();
       String sql = "SELECT * FROM Test WHERE id = '" + el.getId() + "'";
       Record r = db.getTestRecord(sql);//this function makes connection, executeQuery etc...and return Record object with values
       if(r != null) {
         //do something
       }
     }
    }
}

これは最善の方法ではないと思います。

私が考えているもう 1 つの方法は、逆で、データベースを反復処理し続けることです。

アップデート

タイマーに関するフィードバックをありがとうございますが、それで問題が解決するとは思いません。データベースで変更が発生すると、変更された値 (サンプル コードの「els」) に対してほぼ瞬時に結果を処理する必要があります。

データベースが変更されない場合でも、変更された値に対して常にチェックする必要があります。

更新 2

OK、答えに興味がある人には、今すぐ解決策があると思います。基本的に、解決策はこれにデータベースを使用しないことです。読み込み、更新、追加など...データベースから必要なものだけをメモリに保存します。そうすれば、データベースを頻繁に開いたり閉じたりする必要がなく、データベースに変更を加えたときにのみデータベースを処理し、それらの変更をメモリに反映して、その時点でメモリ内にあるものだけを処理します。確かにこれはより多くのメモリを消費しますが、ここではパフォーマンスが絶対的な鍵となります。

定期的な「タイマー」の回答については、申し訳ありませんが、これはまったく正しくありません。タイマーの使用がこの特定の状況をどのように解決するかについて、誰も答えていません。

しかし、フィードバックをありがとう、それにもかかわらず、それはまだ役に立ちました.

4

6 に答える 6

3

別の可能性は、を使用することScheduledThreadPoolExecutorです。

Runnableロジックを含む を実装し、ScheduledExecutorService次のように に登録できます。

ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10);
executor.scheduleAtFixedRate(myRunnable, 0, 5, TimeUnit.SECONDS);

上記のコードScheduledThreadPoolExecutorは、プールに 10 個のスレッドを持つ を作成し、Runnableすぐに開始して 5 秒間実行される を登録します。


ランナブルをスケジュールするには、次を使用できます。

scheduleAtFixedRate

指定された初期遅延の後に最初に有効になり、その後指定された期間で有効になる定期的なアクションを作成して実行します。つまり、実行は initialDelay の後に開始され、次に initialDelay+period、次に initialDelay + 2 * period というようになります。

scheduleWithFixedDelay

指定された初期遅延の後に最初に有効になり、その後、1 つの実行の終了と次の開始の間の指定された遅延で有効になる定期的なアクションを作成して実行します。


ここでは、ThreadPoolExecutor要件に適合するかどうかを確認するために、の利点を確認できます。私はこの質問をお勧めします: Java Timer vs ExecutorService? 良い決断をするためにも。

于 2013-05-14T05:57:41.320 に答える
0

「ビジー ループ」を回避するには、トリガーを使用します。H2 はDatabaseEventListener API もサポートしているため、テーブルごとにトリガーを作成する必要はありません。

これは、たとえばリモート接続を使用している場合など、常に機能するとは限りません。

于 2013-05-15T07:40:04.327 に答える
0

更新 2

OK、答えに興味がある人には、今すぐ解決策があると思います。基本的に、解決策はこれにデータベースを使用しないことです。読み込み、更新、追加など...データベースから必要なものだけをメモリに保存します。そうすれば、データベースを頻繁に開いたり閉じたりする必要がなく、データベースに変更を加えたときにのみデータベースを処理し、それらの変更をメモリに反映して、その時点でメモリ内にあるものだけを処理します。確かにこれはより多くのメモリを消費しますが、ここではパフォーマンスが絶対的な鍵となります。

于 2013-05-17T17:11:58.790 に答える