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

use*_*329 4 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) {
}
Run Code Online (Sandbox Code Playgroud)

我想在 5 秒后(按照我的配置)抛出异常。

Kar*_*cki 5

您可以尝试允许您在 X 秒后超时验证查询的validationQueryTimeout参数

dataSource.setValidationQueryTimeout(5);
dataSource.setTestOnBorrow(true);
Run Code Online (Sandbox Code Playgroud)

您不必设置验证 SQL 查询,现代 JDBC 驱动程序具有 Connection.isValid().

不幸的是,DBCP 池根据错误行为存在问题由于操作系统 TCP 超时限制,处理数据库关闭。在 2017 年进行测试时:

dbcp2 没有返回连接,也没有超时。由于未确认的 TCP 流量,验证查询的执行被卡住。随后,测试工具在(坏)连接上运行的 SQL 语句挂起(由于未确认的 TCP)。setMaxWait(5000) 对于处理网络中断似乎没有用。没有其他有意义的超时设置适用于网络故障。