我使用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()
)。这是有效的,但不是理想的,因为如果我的服务器死了,那么没有人会杀死正在运行的查询。