以下简单查询未完成。准备好的声明
Posted
技术标签:
【中文标题】以下简单查询未完成。准备好的声明【英文标题】:The Following simple query does not complete. Prepared Statement 【发布时间】:2012-05-21 00:04:52 【问题描述】:我有以下疑问:
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 中的某些内容?
【问题讨论】:
您还有其他通过 JDBC 正常运行的查询吗? 是的,只有这个有问题。 性能方面,超过 4 的 VARCHAR 列不太理想。这是我建议使用 INTID
列作为主键并在 URL 列上使用 UNIQUE 约束的情况之一
@OMGPonies 是的,我会改变它。(现在运行测试)但主要问题尚未解决。
【参考方案1】:
由于代码看起来不错,这可能是数据库方面的问题。可能是其他人通过更新它而不是执行提交/回滚来阻止该行(很可能来自您的 MS-SQL Server 管理工作室!)。您可以为同一记录查找其他进程拥有的锁,以便确定这不是数据库问题。
【讨论】:
【参考方案2】:在 pageUrl 上创建索引:
create index tbl_page_pageUrl_index on tbl_page(pageUrl);
这将允许快速访问您要更新的行。
如果没有此索引,数据库必须执行全表扫描,并且当与 update
命令结合使用时,可能会导致锁争用甚至死锁,具体取决于您的锁定选项。
【讨论】:
我觉得已经是PK了,估计是他打错了urlLink
。
抱歉这个错误。 pageUrl
是tbl_page中的PK以上是关于以下简单查询未完成。准备好的声明的主要内容,如果未能解决你的问题,请参考以下文章