以下简单查询未完成。准备好的声明

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 列不太理想。这是我建议使用 INT ID 列作为主键并在 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

以上是关于以下简单查询未完成。准备好的声明的主要内容,如果未能解决你的问题,请参考以下文章

如何在分组count查询情况下将count的字段再分组

如何将参数绑定到未准备好的查询?

Elasticsearch按查询删除未完成删除

Android - 在返回语句之前未完成 Firestore 查询 [重复]

Mongoose:查询未完成时如何findById

Mongoose:查询未完成时如何findById