PostgreSQL错误:由于用户请求而取消语句
org.postgresql.util.PSQLException: ERROR: canceling statement due to user request
PostgreSQL的 9.1.6 on x86_64-redhat-linux-gnu, compiled by gcc (GCC) 4.7.2
20120921 (Red Hat 4.7.2-2), 64-bit".
我的PostgreSQL驱动程序是: postgresql-9.2-1000.jdbc4.jar
使用java版本: Java 1.7
提示:我的postgresql数据库位于固态硬盘上,并且此错误是随机发生的,有时根本不会发生。
回答:
我们已经找到了造成此问题的原因。最新的JDBC驱动程序9.2-100x中setQueryTimeout()的错误实现解释了这一点。如果您手动打开/关闭连接,则可能不会发生这种情况,但通常是在适当位置建立连接池并将
设置为
。在这种情况下,应使用非零值调用setQueryTimeout()(例如,使用Spring框架@Transactional(timeout =
xxx)批注)。
事实证明,只要在语句执行过程中引发SQL异常,取消计时器就不会被取消并保持活动状态(这就是实现方式)。由于存在池,后面的连接不会关闭,而是返回到池中。稍后,当取消计时器触发时,它会随机取消当前与此计时器创建时所使用的连接相关的查询。目前,这是一个完全不同的查询,它解释了随机性的影响。
建议的解决方法是放弃setQueryTimeout(),改用PostgreSQL配置(statement_timeout)。它没有提供相同级别的灵活性,但至少始终有效。
以上是 PostgreSQL错误:由于用户请求而取消语句 的全部内容, 来源链接: utcz.com/qa/431981.html