PostgreSQL JDBC 套接字超时不会杀死后台进程
Posted
技术标签:
【中文标题】PostgreSQL JDBC 套接字超时不会杀死后台进程【英文标题】:PostgreSQL JDBC socket timeout doesn't kill background process 【发布时间】:2016-12-14 15:27:01 【问题描述】:我正在使用 JDBC 对我的 PostgreSQL 数据库运行查询。当查询花费太长时间时,我希望它们死掉。我设置了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】:你应该设置statement_timeout
。
【讨论】:
嗨。我怎样才能从上面的 JDBC 语句中做到这一点? (我需要每个语句的超时,即每个语句可能有不同的超时) conn.createStatement().execute("set statement_timeout to "+timeoutSeconds);// 这似乎可以解决问题以上是关于PostgreSQL JDBC 套接字超时不会杀死后台进程的主要内容,如果未能解决你的问题,请参考以下文章