将基本DataSource与连接池DataSource混合:何时调用close()?

时间:2010-02-23 20:18:34

标签: java mysql jdbc connection-pooling derby

我正在将连接池添加到我们的java应用程序中。

该应用可以使用不同的rdbmses,既可以作为桌面应用,也可以作为无头网络服务。基本实现在桌面模式下工作正常(rdbms = derby)。当作为webservice(rdbms = mysql)运行时,我们看到需要连接池才能获得良好的并发行为。

我最初的方法是使用依赖注入来决定在启动时基本DataSource或连接池DataSource。

这种情况下的问题是我不知道何时调用connection.close()。我的理解是,在使用连接池时,您应该在每次查询后关闭(),以便可以回收连接对象。但是当前的非池实现尝试尽可能长时间地挂起Connection对象。

这个问题有解决方法吗?有没有办法回收基本连接对象?如果我不使用线程池连接对象调用connection.close()会发生什么?

或者混合这两种连接策略只是一个糟糕的设计?

1 个答案:

答案 0 :(得分:2)

如果我理解正确的话,基本上你是通过尽可能长时间地保持连接来进行自己的池实现。如果此策略成功(即程序的行为与您描述的一样),那么您已拥有自己的池。添加池的唯一方法就是改善你建立新连接时的响应时间(因为你不会真正创建一个,你将从池中获取它),这显然不会经常发生

因此,我将循环回到这个问题的基础假设:事实上你的并发性能问题是否与数据库池有关?如果你在MySQL而不是Derby中使用事务,这可能是并发问题的一个重要原因,作为一个不同的潜在原因的例子。

要直接回答您的问题,请始终使用数据库池。它们的开销非常小,当然也会更改代码以快速释放连接(例如,当请求完成时,不是用户打开屏幕时),而不是永久保留它们。