Java Docker pause数据库让语句永远挂起

Java Docker pause数据库让语句永远挂起,java,postgresql,docker,jdbc,Java,Postgresql,Docker,Jdbc,我有一个运行在docker上的PostgreSQL数据库,我想测试java系统处理连接问题的能力。我在两种不同的场景下测试java服务:停止容器(docker stop postgresContainer)和暂停容器(docker pause postgresContainer) 当我停止容器时,JDBC会立即抛出一个异常,我可以捕获并处理它,但当我暂停时,服务会处于锁定状态,JDBC语句将永远挂起执行,直到容器“未暂停”,此时方法流返回并执行挂起的语句 我还注意到,当我通过调用connecti

我有一个运行在docker上的PostgreSQL数据库,我想测试java系统处理连接问题的能力。我在两种不同的场景下测试java服务:停止容器(
docker stop postgresContainer
)和暂停容器(
docker pause postgresContainer

当我停止容器时,JDBC会立即抛出一个异常,我可以捕获并处理它,但当我暂停时,服务会处于锁定状态,JDBC语句将永远挂起执行,直到容器“未暂停”,此时方法流返回并执行挂起的语句

我还注意到,当我通过调用
connection.isValid(1)获得JDBC连接状态时它也永远挂在这里

public void executeStatement(字符串查询){
试一试{
Connection=getConnection();
语句Statement=connection.createStatement();
//当容器“暂停”时,它会永远卡在这里
//当我取消暂停时,要执行的查询将持久保存在数据库中
语句。执行(查询);
语句。close();
connection.close();
}
捕获(例外e){
语句。close();
connection.close();
}
请参见

特别是:

connectTimeout=int

用于套接字连接操作的超时值。如果连接到 服务器花费的时间超过此值,连接已断开 超时以秒为单位指定,值为零表示超时 残疾人

socketTimeout=int

用于套接字读取操作的超时值。如果从 服务器花费的时间超过此值,连接已关闭。此 可以用作蛮力全局查询超时和 检测网络问题。超时以秒为单位指定,以秒为单位 值为零表示它已禁用


在我的特定情况下,我可以通过添加连接超时和连接获取超时来解决这个问题

要设置网络超时,我调用了
connection.setNetworkTimeout(null,timeoutInSeconds*1000);
。我无法使用它,因为我的postgres驱动程序版本太旧了


为了设置连接获取超时(我使用c3p0来处理连接池),我在创建ComboPooledDataSource实例时添加了以下调用
c3p0ConnectionPool.setCheckoutTimeout(checkoutTimeout);

是否指定了
socketTimeout
连接属性?如果没有,它将无限期等待。