JDBC连接池库可以很好地处理经常处于空闲状态的连接吗?

时间:2019-05-27 23:54:56

标签: jdbc database-connection connection-pooling jdbc-pool tomcat-dbcp

让我们说下面的代码存在于服务器端后端:

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。

1 个答案:

答案 0 :(得分:0)

使用cp3连接池。

属性 max_idle_time 可能在这里满足您的要求。

  • maxIdleTime

默认值:0

第二个连接可以保持池化,但在丢弃前不使用。零表示空闲连接永不过期。

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