让我们说下面的代码存在于服务器端后端:
class Foo {
void doSomething() {
try (Connection c = dataSource.getConnection()) {
executeSQL(c);
externalApiCall(); // this can be slow
executeSQL(c);
}
}
}
这里的问题是externalApiCall()
可能非常慢,并且使许多数据库连接保持打开状态(即使未使用),并且可能导致连接数上限用尽。这将对我的应用程序中不依赖任何外部API的其他部分有害,我想避免这种情况。
上面的代码已简化,实际上我使用了类似ServletFilter的方法,当它接收到http请求时,它将Connection放入ThreadLocal,因此很难更改在业务逻辑开始时打开Connection的整体机制。
所以我的问题是:是否没有任何不错的连接池库,包装程序或可以很好地处理这种情况的东西?例如,某些东西只有在创建Statement对象时才打开真实的数据库连接,然后在Statement关闭时自动关闭连接。目前,我使用的是Tomcat DBCP。
答案 0 :(得分:0)
使用cp3连接池。
属性 max_idle_time 可能在这里满足您的要求。
默认值:0
第二个连接可以保持池化,但在丢弃前不使用。零表示空闲连接永不过期。
有关更多信息,请参阅 https://www.mchange.com/projects/c3p0/