4

JDBCを使用してMySQLデータベースの行を更新しています。

    pConnection.setAutoCommit(true); 

    PreparedStatement pstmt = pConnection.prepareStatement("update mg_build_queue " + //
            "set buildsetid=?,locale=?,areacode=?,distversionid=?,platformid=?,version=?," + //
            "priority=?,buildstatus=?,computername=?,buildoutput=?,started=?,finished=?, packageid=?, lockcounter=0 where buildid=?" //
    );

    pstmt.setInt(1, mBuildSet.getId());
    pstmt.setString(2, Locale.localesToString(mLocales, ","));
    pstmt.setString(3, mAreaCode.toString());
    pstmt.setInt(4, mDistVersionId);
    pstmt.setInt(5, mPlatform);
    pstmt.setInt(6, mVersion);
    pstmt.setLong(7, mPriority);
    pstmt.setInt(8, mBuildStatus);
    pstmt.setString(9, mComputerName);
    pstmt.setString(10, mBuildOutput);
    pstmt.setTimestamp(11, timeToTimestamp(mStarted));
    pstmt.setTimestamp(12, timeToTimestamp(mFinished));
    pstmt.setInt(13, mResultPackageId);
    pstmt.setInt(14, mBuildId);

    LOGGER.debug("Updating data for mg_build_queue: " + pstmt);
    pstmt.execute();
    LOGGER.debug("Updated " + pstmt.getUpdateCount() + " rows."); 

これにより、次の出力が生成されます。

2012-05-24 09:54:33,211 [Thread-1] DEBUG com.buildmaster.BuildQueueEntryImpl - Updating data for mg_build_queue: com.mysql.jdbc.JDBC4PreparedStatement@35e09eab: update mg_build_queue set buildsetid=201,locale='FR',areacode='XX',distversionid=95,platformid=4604,version=65807,priority=33652480,buildstatus=1,computername='MY_COMPUTER-C:\\BUILDS',buildoutput='',started='2012-05-24 09:54:33',finished='2012-05-24 19:45:27', packageid=0, lockcounter=0 where buildid=122418
2012-05-24 09:54:33,214 [Thread-1] DEBUG com.buildmaster.BuildQueueEntryImpl - Updated 1 rows.

例外はありません。DBVisualizerでエントリをクエリすると、古い値のみが表示されます。DBVisualizer(上からコピーして貼り付けたもの)でコマンドを手動で実行すると、更新された値を確認できます。

なぜこうなった?

4

5 に答える 5

0

奇妙ですが、Eclipseを再起動するとこの問題は停止しました

于 2016-11-27T05:43:26.620 に答える
0

問題は、DBVisualizer が何らかの結果キャッシュを実行していることにあるようです。DBVisualizer を使用して接続を切断し、再接続したところ、更新が表示されました。彼らの提案に感謝します。

DBVisualizer フォーラムの Hans Bergsten のおかげで、私の問題を回避する方法は次のとおりです。

ツール -> ツールのプロパティ -> データベース -> MySQL -> 物理接続

に変更Transaction IsolationTRANSACTION_READ_COMMITTEDます。

: MySQL データベースも再起動しました。影響はないと思いますが、言及する価値はあります。

于 2012-05-24T17:45:37.040 に答える
0

pConnection.commit()明示的に設定した場合、呼び出しはデータベースの変更を反映する必要があります

pConnection.setAutoCommit(false)

于 2012-05-24T17:21:26.473 に答える
0

これはおそらく、MySQL のデフォルトの分離レベルである「REPEATABLE READ」が原因です。

JDBC ステートメントが適切にコミットされた場合は、DBVisualizer で開いているトランザクションも終了する必要があります。select ステートメントはトランザクションを開始し、それを終了しない限り、他のトランザクションによって行われた変更は表示されません。

もう 1 つのオプションは、デフォルトの分離レベルを READ COMMITTED に変更することです。

于 2012-05-24T22:46:08.650 に答える