Java Docker pause数据库让语句永远挂起
我有一个运行在docker上的PostgreSQL数据库,我想测试java系统处理连接问题的能力。我在两种不同的场景下测试java服务:停止容器(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 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
连接属性?如果没有,它将无限期等待。