0

假设有这个代码存在于服务器端后端:

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。

4

1 回答 1

0

使用 cp3 连接池。

此处的属性max_idle_time可能会满足您的要求。

  • 最大空闲时间

默认值:0

在被丢弃之前,连接可以保持池化但未使用的秒数。零表示空闲连接永不过期。

有关更多信息,请参阅 https://www.mchange.com/projects/c3p0/

于 2019-05-28T00:06:18.910 回答