我正在使用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
。