PostgreSQL JDBC 套接字超时不会杀死后台进程

Posted

技术标签:

【中文标题】PostgreSQL JDBC 套接字超时不会杀死后台进程【英文标题】:PostgreSQL JDBC socket timeout doesn't kill background process 【发布时间】:2016-12-14 15:27:01 【问题描述】:

我正在使用 JDBC 对我的 PostgreSQL 数据库运行查询。当查询花费太长时间时,我希望它们死掉。我设置了socketTimeout(如下所示),它确实成功地终止了连接,但是如果我在PostgreSQL服务器上查看pg_stat_activity,查询通常会继续运行(最多几分钟)。

我的代码看起来有点像这样:

Properties props = new Properties();
props.setProperty("user", datasource.getUsername());
props.setProperty("password", datasource.getPassword());
props.setProperty("socketTimeout", ""+(timeoutSeconds));
props.setProperty("loginTimeout", "10");
conn = datasource.getDbType().getDriver().connect(url, props);
conn.setReadOnly(true);
conn.setAutoCommit(false);
PreparedStatement statement = conn.prepareStatement(sql);
return statement.executeQuery();

我的假设是 socketTimeout 实际上只是杀死了连接,而不是 postgres 服务器上正在运行的进程。即,此超时是驱动程序端而不是 PostgreSQL 端。

有没有办法设置一个超时(在每个语句级别),这实际上会让 PostgreSQL 在给定超时后终止查询本身?

注意:到目前为止,我找到了一种解决方案,即在给定超时后显式取消查询(即using statement.cancel())。这可行,但并不理想,因为如果我的服务器死了,那么没有人会终止正在运行的查询。

【问题讨论】:

【参考方案1】:

你应该设置statement_timeout

【讨论】:

嗨。我怎样才能从上面的 JDBC 语句中做到这一点? (我需要每个语句的超时,即每个语句可能有不同的超时) conn.createStatement().execute("set statement_timeout to "+timeoutSeconds);// 这似乎可以解决问题

以上是关于PostgreSQL JDBC 套接字超时不会杀死后台进程的主要内容,如果未能解决你的问题,请参考以下文章

Future 超时后是不是会杀死线程?

如何在jdbc中设置锁定超时

Erlang 套接字发送超时永远不会发生

@Transactional 上的 MySQL 套接字超时行为

Php不会杀死进程

如何增加 Quarkus 中的事务超时?