Java - 内存管理/数据库连接问题

时间:2011-01-20 01:14:57

标签: java database memory-management database-connection connection-pooling

我正在用Java编写数据库连接池。它只是一个拥有大量连接并将它们释放出来的类。

我是否需要某种析构函数方法,以便在我的类的实例超出范围时关闭数据库连接?

编辑: 这仅用于学习目的。我肯定会在生产中使用可靠的开源连接池。我真的只想了解内存管理的含义。

3 个答案:

答案 0 :(得分:2)

如果您是为了学习目的而尝试这样做,那么您正在做的事情很好。下载下面提到的库之一的源代码并浏览他们的代码。这将有助于您了解它们如何处理连接的生命周期。

但是如果您想将它作为生产应用程序的一部分使用,那么我强烈建议您使用以下其中一种

  1. BoneCP
  2. c3p0

答案 1 :(得分:2)

就在我的头顶,说你有一个物体,你的钥匙。为您的密钥实现唯一标识。 hashCode()是一个很好的起点。创建对象时,请将对象放在WeakReference中并将其与ReferenceQueue关联。现在使用hashCode作为Map<int, Connection>的键。当您的对象超出范围时,请转到ReferenceQueue以检索对象,使用hashCodeConnection获取Map并关闭它。

参见参考文献here

的教程

答案 2 :(得分:1)

正确的方法是将连接实例包装在您自己的类中,该类实现java.sql.Connection,然后通过池提供“连接”。您将被迫实施所有可以愉快地传递给“真实”连接的方法。除了一个 - 关闭()。在此方法中,您应该将连接返回到池而不关闭它。

只要让对象超出范围,就不能将对象返回到池中。你可以把一些东西放在finalize()中,然后将它返回到池中,但这样做很危险。 Finalize()只对任何对象运行一次,所以如果你在那里放一些东西来“捕获”对象并阻止它被gc'd,那么finalize()将永远不再被调用。