2012-04-26 30 views
0

有关垃圾回收器的问题。 如果我已经创建了数据库连接并在数据库上执行了一些操作,之后我没有使用连接对象的时间更长,垃圾收集器可以释放我的连接。我希望以后使用此连接。数据库连接上的Java垃圾回收器

编辑:只是为了确认,如果我已经创建了我的连接是在webapp的上下文级别然后最新情况?

+0

你可以把它静态 – 2012-04-26 07:22:16

+0

感谢hardik快速评论,只是为了确认,如果我创建了我的连接是在上下文水平webapp然后最新情况? – NutchUser 2012-04-26 07:25:00

+0

跟着我重复; GC收集垃圾,GC收集垃圾。即丢弃的对象,而不是您引用的对象。 – 2012-04-26 07:26:13

回答

6

如果您保留参考Connection对象,则垃圾收集器将永远不会触及您的对象,并且数据库连接将保持不变。只要记住它不能被多个线程使用。

另一方面,如果您保持连接打开时间过长,某些底层资源(如TCP/IP套接字)可能会中断。

如果你失去了最后一个引用的连接(通过覆盖或设置为null)垃圾收集释放与连接和连接本身相关联的所有Java对象。但它不会释放底层数据库连接,因此你必须始终显式调用:

connection.close(); 
+0

注意:它不仅是我们自己的可以引用连接的代码。例如。如果它在连接池中进行管理,那么该池将一直保持强烈的参考,直到其生命周期结束。 – 2012-04-26 07:29:30

+0

它可能取决于驱动程序的实现,垃圾收集完成关闭连接,但这是不可靠的,所以你应该打电话关闭。如果连接空闲时间过长,某些驱动程序实现可能会超时并关闭。 – 2012-04-26 22:32:34

+0

“但它不会释放底层数据库连接”,底层数据库连接究竟是什么? – 2015-04-14 21:50:49

0

只要您保留对该连接的引用,连接就不会被垃圾收集。因此理论上你可以继续使用它,只要你喜欢。

0

如果您不再引用连接对象,那么它就是垃圾回收的成员,但绝不能保证它会被gc垃圾回收。它完全取决于gc。

如果你想在将来使用它,最好使它成为一个全局对象。以便您的应用程序将保留一个引用,并且它不会成为垃圾回收的成员。

+0

使用不影响垃圾收集。唯一重要的是是否存在对连接的引用。所以,只要你可以调用“connection.createStatement()”,那么连接就不会被收集。 – Torben 2012-04-26 07:25:12

+0

对不起,我真的想说不再引用,我会编辑它。谢谢@torben – 2012-04-26 07:36:38

1

JVM垃圾收集简而言之:如果您或其他人拥有对某个对象的引用,那么不允许JVM垃圾收集它。如果你没有引用它,那么JVM不会垃圾收集它,直到它想要。

0

取决于您的连接类型。如果你有强烈的参考,那么它不会被垃圾收集,但如果你有较弱的参考,那么它将有资格获得GC。

如果它由静态或实例级别保存,则不会被垃圾收集。

但是,不要长时间保持数据库连接(考虑到每个数据库都有连接数量的限制),您应该在需要时释放并重新获取。

您还应该考虑使用ConnectionPool来实现更好的连接管理。