假设有这个代码存在于服务器端后端:
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。