【发布时间】: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