PostgreSQL JDBC 套接字超时不会终止后台进程

PostgreSQL JDBC socket timeout doesn't kill background process

我正在对我的 PostgreSQL 数据库使用 JDBC 到 运行 查询。当查询花费的时间太长时,我希望它们死掉。我设置了 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 服务器上的 运行ning 进程。即,此超时是驱动程序端而不是 PostgreSQL 端。

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

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

你应该设置statement_timeout.