Pg jdbc 随机报错 PSQLException: ERROR: canceling statement due to user request ?
生产环境随机出现 canceling statement due to user request 报错
使用的是 springboot + mybatis-pus + druid
网上检索到的原因:jdbc 的链接定时器导致,通过设置 defaultStatementTimeOut 可以解决。
但是通过上述的方法,这个报错还是在不间断的随机出现,如何解决?
回答:
报错的直观问题时,在使用一个数据库链接执行sql的时候,sql还没有执行完,链接被驱动主动关闭了。
所以有一下几种可能,可以排查一下
- sql执行的时间太长了,链接配置的timeout时间太短了,所以主动关闭了。这种情况下,每次exception的sql如果都是同一个,那需要优化sql,如果不是同一个,可以观测下数据库状态,可能压力太大,资源不足,或者网络问题,导致sql执行时间大于预期,链接被关闭了。
- autocommit=false,如果没有配置自动提交,transaction最后也没有正确关闭链接(比如Exception了),可能会导致链接被扔回连接池,然后被其他sql复用,这个时候因为关闭计时是在上一个事务的时候开始的,所以可能新的sql执行过程中,链接超时关闭了。这种情况,按说还是代码上有些问题,可以检查一下,不过可以通过配置autocommit=true,或者try/catch/final一类的手动关闭connection,也许能绕过。
- 检查一下相关的版本,保不齐是连接池/驱动或者orm的bug导致的,可以升级一下版本试试,也许报错就被解决了,但主要原因还是sql执行时间和statment的超时时间冲突了,还是需要确保下代码质量
回答:
你需要了解下这个系统函数:
pg_cancel_backend(pid int)
可能的原因是:
后台监控运维系统,检查到特定的查询存在运行的相关风险,并通过pg_cancel_backend系统函数取消了该查询。
以上是 Pg jdbc 随机报错 PSQLException: ERROR: canceling statement due to user request ? 的全部内容, 来源链接: utcz.com/p/945221.html