1

次のクエリがあります。

String updatequery = "UPDATE tbl_page SET linkCount = ?, pageProcessed = 1 WHERE pageUrl =?";
PreparedStatement updatestmt = kon.prepareStatement(updatequery);
updatestmt.clearParameters();
//updatestmt.setQueryTimeout(10);
updatestmt.setInt(1, linkCount);
updatestmt.setString(2, urlLink);
updatestmt.executeUpdate();

クエリのタイムアウトを 10 秒に設定すると、クエリがタイムアウトした例外がキャッチされます。しかし、私がそうしないと、それは待ち続けます。クエリの何が問題になっていますか? pageUrl列は主キーですvarchar(900)

MS SQl Server Management Studio ('?' をその値に置き換えたもの) でこのクエリを実行すると、正常に動作するため、準備されたステートメントに問題がある可能性があります。

Java または MSSQL で何か不足していますか?

4

2 に答える 2

2

コードは問題ないように見えるため、これはデータベース側の問題である可能性があります。他の誰かが行を更新してコミット/ロールバックを行わずにブロックした可能性があります (ほとんどの場合、MS-SQL Server Management studio から!)。これがデータベースの問題ではないことを確認できるように、同じレコードに対して他のプロセスが所有するロックを探すことができます。

于 2012-05-21T08:48:36.223 に答える
1

pageUrl にインデックスを作成します。

create index tbl_page_pageUrl_index on tbl_page(pageUrl);

これにより、更新する行にすばやくアクセスできます。

このインデックスがないと、データベースは全テーブル スキャンを実行する必要があり、コマンドと組み合わせると、updateロック オプションによってはロックの競合やデッドロックが発生する可能性があります。

于 2012-05-21T00:17:05.703 に答える