【问题标题】:PostgreSQL queries not killed on app server shutdownPostgreSQL 查询未在应用服务器关闭时终止
【发布时间】:2019-09-22 03:55:10
【问题描述】:

我有一个 WildFly,它托管一个应用程序,该应用程序正在调用一些长时间运行的 SQL 查询(比如查询或 SP 调用,需要 10-20 分钟或更长时间)。

以前这个 WildFly 指向 SQL Server 2008,现在指向 Postgres 11。

以前当我杀死/重新启动 WildFly 时,我注意到很快(如果不是瞬间)由 Java 代码(在 WildFly 中运行)触发的长时间运行的 SP/查询调用也被杀死了。

现在...使用 Postgres,我注意到这些长时间运行的查询仍然存在,并且即使在应用服务器关闭后也继续在 Postgres 中运行。

这是什么原因造成的?谁在 SQL Server 中杀死它们(服务器端本身或 JDBC 驱动程序或......)? Postgres 中是否有一些设置/参数控制这种行为,即如果触发查询的客户端已关闭,数据库服务器将对查询执行什么操作。

编辑:我们通过向 WF 发送命令自行关闭来进行正常的 WildFly 关闭。 SQL Server 和 Postgres 之间的行为似乎仍然不同。

【问题讨论】:

  • 来自JDBC Connection doc:“如果调用了close方法并且有一个活动事务,则结果是实现定义的”。我的猜测是 SQLServer JDBC 驱动程序选择中止事务,可能与 .Net implementation 一致,而 postgreSQL JDBC 驱动程序没有
  • 嗯,根据this DBA SE answer,一旦发起查询的连接关闭,PostgreSQL 应该中断查询,但在处理过程中可能没有意识到。
  • 所以可能是 PG JDBC 驱动程序导致了这个问题,对吧? PG驱动程序中是否有任何设置?还是在 Postgres 服务器本身?我无法想象这种行为就是这样,无法改变。
  • 这就是我第一次发表评论时要去的地方,但是鉴于第二个中的链接在我看来,PostgreSQL 更可能忙于处理并且直到稍后才检查是否应该中止查询.无论如何,我已经检查了 JDBC 驱动程序参数,但没有任何相关内容。
  • 您可以确保问题与 Wildfly 和 JDBC 驱动程序无关,方法是使用您会中断一个或多个连接的命令行客户端(pgsql,如果内存正常) DBA SE 答案中描述的方式。如果它的行为相同,您将不得不更改查询或 postgreSQL 数据库配置(我不知道任何可能影响此行为的)

标签: postgresql jdbc wildfly amazon-rds postgresql-11


【解决方案1】:

如果关闭应用程序服务器导致 JDBC 调用终止数据库会话,则不应发生这种情况。如果它没有正确关闭 JDBC 连接,我会称其为应用程序服务器中的错误。如果是这样,但后端的查询没有取消,我会称之为 JDBC 驱动程序中的错误。

无论如何,一种解决方法是将tcp_keepalives_idle 设置为较低的值,以便服务器快速检测到死TCP 连接并终止查询。

【讨论】:

  • 劳伦兹,非常感谢您的回答。我还有几个问题。 1)引用:“如果关闭应用程序服务器导致终止数据库会话的JDBC调用,这不应该发生”我不明白你的意思。恰恰相反,不是吗?我的意思是关闭应用程序服务器的操作迟早会导致关闭从该服务器到数据库服务器的数据库会话(据我所知,检测和关闭延迟会话是数据库服务器的责任,这就是 tcp_keepalives_idle 的意义所在,对吗?)。
  • 2) 我检查了 tcp_keepalives_idle 上的文档,所以感谢您为我们指出这个选项。在我们的例子中它设置为 300(我认为这没问题)。但是......数据库端是否有可能不尊重这个值?我肯定已经看到在服务器端执行查询,即使在客户端 300 秒不活动之后(比如因为应用服务器已关闭或因为最终 Web 用户关闭了发出查询/函数调用的页面)。
  • Ad 1) 是的,显然有问题。我想表达我不确定是什么;是 a) 应用程序服务器没有关闭会话还是 b) 您没有完全关闭应用程序服务器或 c) JDBC 驱动程序中的错误。广告 2)如果您在服务器上将 tcp_keepalives_idle 设置为 5 分钟(并重新加载!),一旦客户端套接字消失,它肯定会在 5 分钟(+一些宽限时间)后取消长时间运行的查询。其他任何东西都是 PostgreSQL 错误。
猜你喜欢
  • 2017-12-27
  • 2017-06-02
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
  • 2023-03-02
相关资源
最近更新 更多