什么原因导致
postgresql中的这个错误?
org.postgresql.util.PsqlException: ERROR: canceling statement due to user request
我的软件版本:
Postgresql 9.1.6 on x86_64-redhat-linux-gnu,由gcc(GCC)4.7.2 20120921(Red Hat 4.7.2-2)64位编译.
我的postgresql驱动程序是:postgresql-9.2-1000.jdbc4.jar
使用java版本:Java 1.7
解决方法
我们已经弄清了这个问题的原因.它是通过在最新的JDBC驱动程序9.2-100x中执行setQueryTimeout()来解释的.如果您手动打开/关闭连接可能不会发生,但是通常会在连接池到位并且autocommit设置为false时发生.在这种情况下,setQueryTimeout()应该调用非零值(例如,使用Spring框架@Transactional(timeout = xxx)注释).
事实证明,在语句执行期间发生sql异常时,取消定时器尚未被取消并保持活动(这就是它的实现方式).因为池,连接后面没有关闭,而是返回到池.
之后,当取消定时器触发时,它随机取消当前与该定时器相关联的连接的查询.在这一刻,这是一个完全不同的查询,解释了随机效应.
建议的解决方法是放弃setQueryTimeout()并使用Postgresql配置(statement_timeout).它不提供相同的灵活性,但至少总是有效.