JDBC连接池内存问题(Java EE应用程序)

时间:2012-10-29 22:26:06

标签: java memory jdbc jvm

我目前有一个Java EE应用程序,我在其中实现了自己的连接池类。我使用的每个方法都做一个简单的查询(Statement和ResultSet)。在每个方法的finally块中我使用JDBC / my pool,我首先关闭ResultSet,然后我关闭Statement尽可能多的书籍和在线指示应该完成。最后,我将连接返回池中。

在观察JVM的内存时,我注意到在通过我的连接池进行调用后,内存从未真正释放,或者需要很长时间才能完成。我检查了我的垃圾收集设置,我正在使用gencon(IBM WebSphere),在线许多资源也表示非常好。我也在我的应用程序中使用Spring Framework。

我写的连接池类非常简单。在初始化时,它会创建一定数量的数据库连接并将它们添加到一个Queue(我尝试了另一个只使用简单Vector的实现,但内存结果相同)。当您请求连接时,它会检查以确保有可用的连接,如果是,它会向呼叫者提供一个连接。最后,您将其返回并将其放回到队列/矢量中。

我想知道是否还有其他事情可以做到这一点?我应该让Spring Framework处理我的连接池,还是有更好的处理内存的东西?对我来说,它确实有意义,但我不太熟悉实现连接池。所有资源都说要做我正在做的事情,但我假设他们可能正在使用一些内置的池实现。我知道关闭连接是有效的,但由于这是一个自定义池化解决方案,我不能真的这样做。

谢谢!

2 个答案:

答案 0 :(得分:4)

您的应用程序是否在WebSphere应用程序服务器中运行?它是从应用服务器获取数据源,而不是自己创建吗?如果是这样,那么连接和语句已经被合并,你不需要自己集合它们。

答案 1 :(得分:2)

好的,第一件事是第一件事:除非你有充分的理由,否则实施自己的连接池机制是一种不必要的风险。有很多连接池机制可供选择 - Spring将是其中之一,雅加达的DBCP是另一个。如果您可以选择使用第三方实用程序进行连接池 - 请执行此操作。如果你在容器内运行,那么让容器为你完成工作(WebSphere已经通过它的各种“帮助器类”完成了这项工作。)

关于您遇到的症状:内存未释放的事实并不意味着内存泄漏。由JVM决定是否以及何时实际释放未引用的对象实例。您是否遇到OutOfMemory错误?

首先发布一些堆转储(在JDBC资源发布之后),看看那里发生了什么。

关于您编写​​的代码 - 没有发布代码,很难猜测您是否隐藏了错误;但是你描述的流程似乎是正确的。