2

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

编辑:只是为了确认,如果我创建了我的连接是在 webapp 的上下文级别,那么情况如何?

4

5 回答 5

9

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

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

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

connection.close();
于 2012-04-26T07:23:58.247 回答
1

JVM 垃圾收集简而言之:如果您或其他任何人引用了一个对象,那么 JVM 就不允许对其进行垃圾收集。如果您没有对它的引用,那么 JVM 在它想要之前不必对它进行垃圾收集。

于 2012-04-26T07:23:42.647 回答
0

只要您保留对它的引用,连接就不会被垃圾收集。因此,理论上您可以随心所欲地继续使用它。

于 2012-04-26T07:23:15.110 回答
0

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

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

于 2012-04-26T07:23:20.760 回答
0

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

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

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

您还应该考虑使用 ConnectionPool 进行更好的连接管理。

于 2012-04-26T07:23:47.450 回答