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



我正在使用JDBC对我的PostgreSQL DB进行查询。当查询花费太长时间时,我希望它们死。我设置了socketTimeout(如下所示),它确实成功地杀死了连接,但是如果我在PostgreSQL Server上查看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())。这有效,但不是理想的,因为如果我的服务器死亡,那么没有人会杀死运行查询。

您应该设置statement_timeout

相关内容

  • 没有找到相关文章

最新更新