当前位置: 首页 > 知识库问答 >
问题:

java - Pg jdbc 随机报错 PSQLException: ERROR: canceling statement due to user request ?

夏理
2023-06-25

生产环境随机出现canceling statement due to user request报错

使用的是springboot+mybatis-pus+druid

网上检索到的原因:jdbc的链接定时器导致,通过设置defaultStatementTimeOut可以解决。但是通过上述的方法,这个报错还是在不间断的随机出现

共有1个答案

齐迪
2023-06-25

报错的直观问题时,在使用一个数据库链接执行sql的时候,sql还没有执行完,链接被驱动主动关闭了。
所以有一下几种可能,可以排查一下

  • sql执行的时间太长了,链接配置的timeout时间太短了,所以主动关闭了。这种情况下,每次exception的sql如果都是同一个,那需要优化sql,如果不是同一个,可以观测下数据库状态,可能压力太大,资源不足,或者网络问题,导致sql执行时间大于预期,链接被关闭了。
  • autocommit=false,如果没有配置自动提交,transaction最后也没有正确关闭链接(比如Exception了),可能会导致链接被扔回连接池,然后被其他sql复用,这个时候因为关闭计时是在上一个事务的时候开始的,所以可能新的sql执行过程中,链接超时关闭了。这种情况,按说还是代码上有些问题,可以检查一下,不过可以通过配置autocommit=true,或者try/catch/final一类的手动关闭connection,也许能绕过。
  • 检查一下相关的版本,保不齐是连接池/驱动或者orm的bug导致的,可以升级一下版本试试,也许报错就被解决了,但主要原因还是sql执行时间和statment的超时时间冲突了,还是需要确保下代码质量
 类似资料:
  • PGJDBC-NG  一个几月netty开发的支持JDBC和PostgreSQL高级特性的新的JDBC 驱动程序。 该驱动具有以下特性: JDBC 4.1 target (with goal of complete conformance) UDT support through standard SQLData, SQLInput & SQLOutput Code Generator for U

  • 问题内容: 当他每次运行程序时都不断获得相同的数字时,我试图向Java解释随机数生成器。我为同一件事创建了自己的简单版本,每次运行该程序时,我也得到了与他得到的确切数字相同的数字。 我究竟做错了什么? 100个数字中的最后五个数字是: 问题答案: 您已经为随机数生成器提供了恒定的值。它是确定性的,因此每次运行都会生成相同的值。 我不确定您为什么选择使用作为种子,但是种子值与生成的值范围无关(这是由

  • 问题内容: 我正在尝试在Java中生成盐,以与用于安全密码存储的哈希算法配合使用。我正在使用以下代码创建随机盐: 这应该生成一个完全安全的,随机生成的盐,以用于我的哈希算法。但是,当我运行代码时,每次都会输出相同的盐…表示生成的盐根本不是随机的。 出于明显的安全性目的,每个用户都需要一个唯一的符号,但是如果我每次创建一个新帐户时都使用此代码,则每个用户都将具有相同的符号,这一开始就破坏了它的用途。

  • 问题内容: 是否有一种Java集合,我的提取顺序是随机的?例如,我将整数1、2、3放入集合中,当我尝试打印它们时,所有结果都可能是“ 1 2 3”,“ 3 2 1”或“ 1 3 2”? 问题答案: 如果只需要随机序列,可以使用Collections.shuffle

  • 新手,我正在制作一个程序,生成一个带有适当后缀的随机序数(即1、2、3…)我无法获得randomInt();工作。我不断收到以下错误: 我在Google和Stack Overflow上搜索了一个无济于事的解决方案。我甚至从互联网上复制和编译了其他使用随机Int()的程序;它们都产生了同样的错误。你能告诉我我做错了什么吗?这是我的程序代码: 欢迎对我的节目提出批评。谢谢

  • 在 Java 中要生成一个指定范围之内的随机数字有两种方法:一种是调用 Math 类的 random() 方法,一种是使用 Random 类。 Random 类提供了丰富的随机数生成方法,可以产生 boolean、int、long、float、byte 数组以及 double 类型的随机数,这是它与 random() 方法最大的不同之处。random() 方法只能产生 double 类型的 0~1