是什么导致了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()的错误实现解释了这一点。如果您手动打开/关闭连接,则可能不会发生这种情况,但通常是在适当的连接池和自动提交设置为 false 的情况下发生的。在这种情况下,应使用非零值调用setQueryTimeout()(例如,使用Spring框架@Transactional(timeout = xxx)批注)。
事实证明,只要在语句执行过程中引发SQL异常,取消计时器就不会被取消并保持 Activity 状态(这就是它的实现方式)。由于存在池,后面的连接不会关闭,而是返回到池中。
稍后,当取消计时器触发时,它将随机取消当前与此计时器创建时所使用的连接相关的查询。目前,这是一个完全不同的查询,解释了随机性的影响。
建议的解决方法是放弃setQueryTimeout(),改用PostgreSQL配置(statement_timeout)。它没有提供相同级别的灵活性,但至少始终有效。
关于java - PostgreSQL错误: canceling statement due to user request,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13114101/