0

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

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

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

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

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

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

4

1 回答 1

2

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

所以,我会回到这个问题背后的假设:您的并发性能问题实际上是否与数据库池有关?如果您在 MySQL 而不是 Derby 中使用事务,这可能是并发问题的一个重要原因,作为不同潜在原因的示例。

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

于 2010-02-23T20:25:27.677 回答