如何使用commons-dbcp BasicDataSource为getConnection设置超时?

时间:2019-04-03 13:47:23

标签: java connection-pooling

我正在使用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秒钟后(按照我的配置)它引发异常。

2 个答案:

答案 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,表示无穷大。