1

外部のmysqlデータベースからのデータを使用するswingアプリケーションがあります。

これらのデータを最新の状態にしたいので、新しいデータが利用可能かどうかを10秒ごとにチェックするスレッドがあります。

これが私のコードです:

public void run() {
    maj.getIgor().open(); // open the connection to Mysql
    while (true) {
        try {
            if (maj.getIgor().getConnexion().isValid(2)) {
                maj.checkProduits(); // update the datas
            } else {
                maj.getIgor().close();
                maj.getIgor().open();
                System.out.println("Re-try to open connection");

            }
            ThreadIgor.sleep(10000);

        } catch (SQLException ex) {
            Logger.getLogger(ThreadMajProduits.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InterruptedException ex) {
            try {
                Thread.currentThread().interrupt();
                maj.getIgor().close();

            } catch (SQLException ex1) {
                Logger.getLogger(ThreadMajProduits.class.getName()).log(Level.SEVERE, null, ex1);
            }

            break;

        }
    }
}

それが私が望むことを行う正しい方法であるかどうか、そしてこのスレッドがデータベースに接続しようとすることによって私のアプリケーションをブロックするリスクがないかどうか疑問に思っていましたか?

ありがとう

4

1 に答える 1

0

まず、接続プールを使用してDBへの接続を取得するとすぐに、スレッドに問題が発生してアプリに遅延が発生することはありません。接続プールを使用していない場合、スレッドを正しく同期していないと、最終的にメインのアプリスレッドに一時停止が発生したり、競合状態が発生したりします。

あなたの質問を読んだときに私の頭に浮かんだ考えは次のとおりです。興味があれば読んでください。間違った推測をした場合は無視してください。

基本的には、DBをポーリングして「新しい」データを探します。問題は、これらのポーリングの1つで新しいデータを取得したとしても、ユーザーが実行する次のトランザクションが古いデータに基づいていないことを安全にすることはできませんこれは基本的な並行性の問題であり、どのような「トリック」を実行しても、トランザクションでそれを処理することから逃れることはできません。

達成しようとしているのが、ユーザーが操作しているフォームのデータを動的に更新することである場合、正しいことは、「last-update」または「version」列のようなものを使用することです。次に、ユーザーが更新をDBにプッシュしようとすると、トランザクション内で、ユーザーが編集しているデータの「最終更新」または「バージョン」が実際にDB、したがって、他の誰もその間に同じデータを編集していないことを確認します。

于 2012-06-27T14:51:04.147 に答える