我正在使用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,表示无穷大。