PostgreSQL JDBC套接字超时不会导致后台进程

时间:2016-12-14 15:27:01

标签: postgresql jdbc timeout

我使用JDBC对PostgreSQL DB运行查询。当查询耗时太长时,我希望它们死掉。我设置了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 个答案:

答案 0 :(得分:2)

您应该设置statement_timeout