PostgreSQL JDBC套接字超时不';t杀死背景进程

PostgreSQL JDBC套接字超时不';t杀死背景进程,postgresql,jdbc,timeout,Postgresql,Jdbc,Timeout,我正在使用JDBC对我的PostgreSQL数据库运行查询。当询问时间过长时,我希望他们死去。我设置了socketTimeout(如下所示),这确实成功地终止了连接,但如果查看PostgreSQL server上的pg_stat_activity,查询通常会继续运行(长达几分钟) 我的代码看起来有点像这样: Properties props = new Properties(); props.setProperty("user", datasource.getUsername()); props

我正在使用JDBC对我的PostgreSQL数据库运行查询。当询问时间过长时,我希望他们死去。我设置了
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在给定的超时之后终止查询本身?


注意:到目前为止,我已经找到了一个解决方案,那就是在给定的超时之后明确地取消查询(即
使用statement.cancel()
)。这是可行的,但并不理想,因为如果我的服务器死机,那么没有人会终止正在运行的查询。

您应该设置。

您好。如何从上面的JDBC语句中实现这一点?(我需要每个语句的超时,即每个语句可能有不同的超时)conn.createStatement().execute(“将语句超时设置为”+timeoutSeconds);//这似乎奏效了