我了解 mysql jdbc 驱动程序的来源。com.mysql.jdbc.NonRegisteringDriver
我在创建连接时在课堂上遇到过,创建了一个幻像引用。然后在后台线程上处理这些链接。如果您可以覆盖finalize()
类中的方法,请解释为什么要使用如此复杂的逻辑com.mysql.jdbc.ConnectionImpl
我了解 mysql jdbc 驱动程序的来源。com.mysql.jdbc.NonRegisteringDriver
我在创建连接时在课堂上遇到过,创建了一个幻像引用。然后在后台线程上处理这些链接。如果您可以覆盖finalize()
类中的方法,请解释为什么要使用如此复杂的逻辑com.mysql.jdbc.ConnectionImpl
我会自己回答,经过一些调查,我发现了以下内容:
以前,
jdbc
驱动程序mysql
使用该方法关闭连接finalize()
。但由于“可怕的”效率低下,它被放弃了。有关此的更多详细信息,请参阅发行说明。特别好奇可以看看commit。问题仍然是为什么它
finalize()
无效。据我了解,它是在调用对象方法的 g 线程中执行的finalize()
。PhantomReference
另一方面,它在单独的线程中处理链接,因此有一些好处,因为 整个构建过程并没有减慢,“需要更多关注”的对象会被更早地处理,并且不会与队列中的其他对象站在一起。您可以通过以下测试来检查这一点:
很明显,测试是不准确的,因为
System.gc()
可能会导致垃圾回收有一些延迟,如果有的话。