我正在使用commons-dbcp2创建到数据库的连接池。当数据库关闭时,dataSource.getConnection()
方法需要20秒钟,然后引发异常。我想将DataSource
配置为动态更改超时,例如5秒。
我尝试了dataSource.setLoginTimeout()
,但BasicDataSource
不支持它
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(driverName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setInitialSize(3);
dataSource.setMaxTotal(100);
dataSource.setValidationQuery(validationquery);
dataSource.setTestOnBorrow(true);
dataSource.setRemoveAbandonedOnBorrow(true);
try (Connection connection = dataSource.getConnection()) {
} catch (Exception e) {
}
我希望5秒钟后(按照我的配置)它引发异常。
答案 0 :(得分:2)
您可以尝试使用validationQueryTimeout
parameter,该方法可让您在X秒钟后使验证查询超时:
dataSource.setValidationQueryTimeout(5);
dataSource.setTestOnBorrow(true);
您不必设置验证SQL查询,现代JDBC驱动程序具有Connection.isValid()
。
很遗憾,由于操作系统TCP超时限制,DBCP池在Bad Behavior: Handling Database Down中存在问题。在2017年完成测试时:
Dbcp2没有返回连接,也没有超时。由于未确认的TCP流量,验证查询的执行被卡住了。随后,由于测试工具挂起,(坏)连接上运行的SQL语句挂起(由于未确认的TCP)。 setMaxWait(5000)对于处理网络中断似乎无效。没有其他有意义的超时设置可应用于网络故障。
答案 1 :(得分:1)
您可以设置 datasource.setValidationQueryTimeout()
,但请记住,这是为了执行查询。如果您有网络问题,您可能仍会卡住。为此,您还需要设置 setSoTimeout()
,用于套接字。默认值为 0,表示无穷大。