java - Spring JDBCTemplate 总是抛出 QueryTimeOutException

标签 java spring maven jdbc

这是我一直摸不着头脑的事情 - 尤其是因为它处理起来令人恼火。

考虑以下代码:

String query = "UPDATE ORDERS SET VOLUME=?,CONTRACT_ID=?,PROJECT_ID=?,WORKSITE_ID=?,DROPZONE_ID=?,DESCRIPTION_ID=?,MANAGER_ID=?,DELIVERY_DATE=?,REVISION=REVISION+1) WHERE ID=?";
jdbcTemplate.update(query, orderEntity.getVolume(), orderEntity.getContractNo(), orderEntity.getProjectID(), orderEntity.getWorksiteID(), orderEntity.getDropzoneID(), orderEntity.getDescriptionID(), orderEntity.getManagerID(), orderEntity.getDeliveryDate(), id);

我们可以看到 SQL 查询不正确 - 因此会抛出一些 SQL 错误,但人们可能会错过这一点。 Spring(对我来说)会抛出一个 QueryTimeoutException 来响应此问题。我对此表示同意,但这没有帮助。

现在让我们尝试一下

String query = "INSERT INTO ORDERS(ID,REISION,CONTRACT_ID,PROJECT_ID,WORKSITE_ID,DROPZONE_ID,DESCRIPTION_ID,MANAGER_ID,VOLUME,DELIVERY_DATE) VALUES(?,?,?,?,?,?,?,?,?,?)";
jdbcTemplate.update(query, id, revision, etc);

另一个很容易被忽略的拼写错误 - REVISION 被错误地拼写为 REISION)Spring 再次抛出另一个 QueryTimeoutException。现在这意味着,如果我遇到异常,我实际上不知道它是什么。是语法错误吗?是列拼写错误吗?这是(更难注意到的)事实,即没有遵循外键约束吗?

在调试时,这很可能是有史以来最令人恼火的事情 - 我所知道的是我的查询无法运行。我怎样才能得到有用的东西?是否有某些内容尚未添加到我的 pom.xml 文件中?

编辑:

这是一个更好的例子。我有一个 DESCRIPTIONS 表,其中包含 ID、REVISION 和 TEXT 列。所有这些都被标记为不可为空。

DescriptionEntity descriptionEntity = new DescriptionEntity("newDesc", 1, null);
String query = "INSERT INTO DESCRIPTIONS (ID,REVISION,TEXT) VALUES(?,?,?)";
jdbcTemplate.update(query, descriptionEntity.getID(), 1, descriptionEntity.getText());

当在 mysql 中运行查询时,这也会引发查询超时异常ERROR 1048 (23000): Column 'TEXT' can not be null

礼貌地说,这有点痛苦。

最佳答案

第一个示例中不是拼写错误,因为您省略了左括号。我想说这不是 Spring 或 JDBC 的问题,而是您的数据库正在尝试处理 SQL,等待更多输入或其他内容,并且从不返回。

在第二个中,我不确定你在说什么,因为我不知道表格设计。我必须假设你的意思是 ID 不是唯一的?再说一遍,我不会责怪 Spring 或 JDBC,也许是驱动器,最有可能是数据库服务器。

请记住,在很多情况下,在用户客户端 UI 中处理 SQL 的方式与通过 JDBC 处理 SQL 的方式不同。例如,在 SQL Server 中,SQL 设置为字符串,传入的参数设置为变量,并使用 sp_executesql() 来运行它。我发现当我有一个通过 SQL Studio Manager 客户端运行得非常好的报告时,但当我实时运行它时却崩溃了,因为由于 SQL 运行方式的差异,查询计划优化器采取了不同的路径。

关于java - Spring JDBCTemplate 总是抛出 QueryTimeOutException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22377551/

相关文章:

java - liferay 上的 Grails portlet

java - "call stack"和 "thread stack"之间的区别

java - 如何在 Spring Boot 中设置方法以在特定日期执行

java - 如何使用两个属性作为key的spring缓存

java - Proguard - 找不到 apache cxf/java.lang.IllegalArgumentException 的常见父类(super class)异常

java - 如何在两个公共(public)函数之间建立牢固的前后关系

java - JMenu 问题中的 JFileChooser

java - Maven GAE 原型(prototype)不工作

android - 在没有jar的Eclipse中导入库

安卓:actionbarsherlock + maven + Intellij 创建apk