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



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

您可以尝试validationQueryTimeout参数,该参数可让您在 X 秒后使验证查询超时:

dataSource.setValidationQueryTimeout(5);
dataSource.setTestOnBorrow(true);

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

不幸的是,DBCP 池存在根据不良行为的问题:由于操作系统 TCP 超时限制而导致数据库关闭。当测试在2017年完成时:

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

您可以设置 datasource.setValidationQueryTimeout() ,但请记住,这是用于查询执行的。如果您遇到网络问题,可能仍然会卡住。为此,您还需要设置 setSoTimeout() ,这是用于套接字的。默认值为 0,表示无穷大。