我有以下查询:
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中的内容?
答案 0 :(得分:2)
由于代码看起来很好,这可能是数据库方面的问题。可能是其他人通过更新它而没有进行提交/回滚来阻止该行(最有可能来自您的MS-SQL Server Management工作室!)。您可以查找同一记录的其他进程拥有的锁,以便您可以确定这不是数据库问题。
答案 1 :(得分:1)
在pageUrl:
上创建索引create index tbl_page_pageUrl_index on tbl_page(pageUrl);
这样可以快速访问要更新的行。
如果没有此索引,数据库必须执行全表扫描,并且与update
命令结合使用时,可能会导致锁争用甚至死锁,具体取决于您的锁定选项。