Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java postgresql错误:由于用户请求而取消语句_Java_Postgresql_Exception - Fatal编程技术网

Java postgresql错误:由于用户请求而取消语句

Java postgresql错误:由于用户请求而取消语句,java,postgresql,exception,Java,Postgresql,Exception,是什么导致postgresql中出现此错误? org.postgresql.util.PSQLException: ERROR: canceling statement due to user request 我的软件版本: x86_64-redhat-linux-gnu上的PostgreSQL9.1.6,由gcc(gcc)4.7.2 20120921(Red Hat 4.7.2-2)编译,64位“ 我的postgresql驱动程序是:postgresql-9.2-1000.jdbc4.jar

是什么导致postgresql中出现此错误?

org.postgresql.util.PSQLException: ERROR: canceling statement due to user request
我的软件版本:

x86_64-redhat-linux-gnu上的PostgreSQL
9.1.6,由gcc(gcc)4.7.2 20120921(Red Hat 4.7.2-2)编译,64位“

我的postgresql驱动程序是:
postgresql-9.2-1000.jdbc4.jar

使用java版本:
Java1.7


提示:我的postgresql数据库位于固态硬盘上,此错误随机发生,有时根本不会发生。

如果您在不使用事务的情况下收到此错误

用户已请求取消该语句。该语句正按照要求执行。问题是,是谁请求取消该语句的

查看代码中为执行SQL做准备的每一行。在某些情况下,可能会有一些方法应用于取消语句的语句,例如:

statement = conn.createStatement();
conn.setAutoCommit(true);
statement.setQueryTimeout(25);
my_insert_statement.setString(1, "moobars");

my_insert_statement.executeUpdate();
statement.close();
在我的例子中,发生的是我将查询超时设置为25秒,当插入时间超过25秒时,它通过了“由于用户请求而取消语句”异常


如果在使用事务时出现此错误:

如果收到此异常,请仔细检查所有执行SQL事务的代码

如果您在事务中有一个查询,而您忘记了提交,然后您使用该连接执行其他操作,就像您不在事务中一样,那么可能存在产生此异常的未定义行为

确保执行事务的所有代码都在自身清理。确保事务开始、完成工作、完成更多工作以及回滚或提交事务,然后确保连接保持在
autocommit=true
状态


如果这是您的问题,则不会在您忘记自己清理的地方引发异常,它发生在您在事务处理后未能清理的很久之后的某个地方,使此异常难以追踪。刷新连接(关闭连接并获取新连接)将进行清理。

除了Eric的建议外,您还可以在以下情况下看到声明取消:

  • 同一用户登录的管理员或其他连接使用
    pg\u cancel\u backend
    请求会话取消其当前语句
  • 管理员向运行您的语句的PostgreSQL后端发送一个信号
  • 管理员请求快速关闭或重新启动PostgreSQL server

检查可能会取消长时间运行的查询的cron作业或负载管理工具。

这假设postgresql的jdbc jar文件中的竞争条件错误是上述错误的原因

解决方案1,定期刷新与数据库的连接

一种解决方法是关闭与数据库的连接,并定期创建与数据库的新连接。在每几千条sql语句之后,只需关闭连接并重新创建它。然后出于某种原因,不再抛出此错误

解决方案2,打开日志记录

如果在设置驱动程序时打开JDBC驱动程序级别的日志记录,则在某些情况下,竞争条件问题将被消除:

Class.forName("org.postgresql.Driver");
org.postgresql.Driver.setLogLevel(org.postgresql.Driver.DEBUG);
解决方案3,捕获异常并重新初始化连接

您还可以尝试捕获特定的异常,重新初始化连接并再次尝试查询

解决方案4,等待postgresql jdbc jar提供错误修复


我认为这个问题可能与我的SSD硬盘的速度有关。如果你遇到这个错误,请在这里发布如何一致地重现它,有开发人员非常有兴趣消除这个错误。

我们已经找出了这个问题的原因。setQueryTimeout()的错误实现解释了这个问题在最新的JDBC驱动程序9.2-100x中。如果手动打开/关闭连接,可能不会发生这种情况,但在连接池就绪且autocommit设置为false时,通常会发生这种情况。在这种情况下,应使用非零值调用setQueryTimeout()(例如,使用Spring framework@Transactional)(超时=xxx)注释)

事实证明,只要在语句执行过程中引发SQL异常,取消计时器就不会被取消并保持活动状态(这就是它的实现方式)。由于池,后面的连接不会关闭,而是返回到池中。 稍后,当取消计时器触发时,它会随机取消当前与创建该计时器的连接关联的查询。此时,它是一个完全不同的查询,解释了随机性效应


建议的解决方法是放弃setQueryTimeout(),改为使用PostgreSQL配置(语句超时)。它不提供相同级别的灵活性,但至少始终有效。

PostgreSQL 9.2.1(x86_64-unknown-linux-gnu上的PostgreSQL 9.2.1,由gcc(gcc)4.1.2 20080704(Red Hat 4.1.2-52)编译),64位),使用相同的JDK和postgresql-9.2-1001.jdbc4.jar驱动程序。数据库位于旋转驱动器上,语句取消是随机发生的,应用程序不取消任何SQL语句,语句超时设置为0(不确定)。尚未确定原因/解决方案。仅供参考:
postgresql-42.2.2
JDBC driverI可能在postgresql-42.2.9 JDBC驱动程序上存在此问题(但不确定,可能是其他问题)。我的很奇怪,当我删除了一个where和子句并通过日期字段进行过滤时,它就消失了。更新到postgresql-42.2.18 JDBC驱动程序修复了这个问题,我在AWS EMR 5.29上使用spark 2.4.4 scala 2.11作业获得了它。v中修复了一个可能相关的问题。