0

我只是在想,在一个大型 Web 应用程序中,每个使用该应用程序的客户端都与数据库建立了数十个连接,有可能很少有连接未关闭。尽管我们必须明确关闭所有连接完全取决于我们,但是,您知道,可能会出现错误。如果发生这种情况,那么几天后我们可能会发现我们的连接池已达到其最大大小,并且应用程序未运行而无法获得连接。

实际上,我的一个项目面临这个问题,每当连接池达到其最大大小时,我都会重新启动服务器,这并不好。

我很想知道如何以更好的方式处理这个问题,我想知道是否有这样的事情,我可以定期关闭连接池中所有未使用的活动连接,例如每 72 小时使用 java 代码?

我说的是 Java/J2ee 技术,我的服务器是 Glassfish Application Server2.1。

编辑:我使用的是 Glassfish 应用程序服务器提供的连接池,而不是任何第三方连接池,并使用 JNDI 数据源使用这个池。

需要你的建议…………

谢谢

4

2 回答 2

0

您可以使用 MiniConnectionPoolManager。它是一个轻量级的独立 Java JDBC 连接池管理器。

看看这篇文章http://www.h2database.com/javadoc/org/h2/jdbcx/JdbcConnectionPool.html。和 dispose() 方法。

有很多 jdbc 驱动支持http://www.source-code.biz/miniconnectionpoolmanager/

于 2012-09-06T05:59:15.170 回答
0

如果我要在没有提供开箱即用的良好连接池的情况下解决这个问题,我会这样做:

  1. 我的应用程序获取连接的一个入口点。
  2. 装饰从自维护池中获得的连接,将定时器设置为配置值(关闭未使用的活动连接)并将这个装饰连接返回给池的客户端。
  3. 如果在计时器触发之前调用了 close 方法,则取消计时器,将调用委托给包装的连接。
  4. 如果在计时器触发时未调用 close 方法,则关闭包装的连接并使此装饰连接对象的状态无效,以便IllegalStateException如果有人再次尝试使用它,它将抛出。

My two cents!

Edit: C3P0 has unreturnedConnectionTimeout that can be configured to handle these kinds of connections taken out from the pool but not returned through a close() call.

于 2012-09-06T06:13:33.697 回答