AbandonedConnectionCleanupThread 实现了 Runnable 接口,在 run 方法里循环读取虚引用队列 referenceQueue 里的虚引用,然后调用 finalizeResource 方法来进行后置的处理,避免连接泄露:
public void run() {while(true) {try {...Reference<? extends MysqlConnection> reference = referenceQueue.remove(5000L);if (reference != null) {//强转为 ConnectionFinalizerPhantomReferencefinalizeResource((ConnectionFinalizerPhantomReference)reference);}...}}}private static void finalizeResource(ConnectionFinalizerPhantomReference reference) {try {//兜底处理网络资源reference.finalizeResources();reference.clear();} finally {//移除虚引用 避免可能造成的内存溢出connectionFinalizerPhantomRefs.remove(reference);}}如果你希望在某些对象被回收的时候做一些后置工作,可以参考 mysql-connector-java 中的一些实现逻辑 。
总结本文简述了一种优雅解决 MySQL 驱动中虚引用导致 GC 耗时较长问题的解决方法、也根据自己的理解讲述了虚引用的作用、结合 MySQL 驱动的源码描述了虚引用的使用场景,希望对你能有所帮助 。
推荐阅读
- Mysql的存储引擎有哪些?
- ChatGPT驱动的虚拟试衣间,提升电子商务购物体验
- OpenHarmony 3.2 Release新特性解读之驱动HCS
- Redis 和 Mysql 如何保证数据一致性?
- MySQL索引,快速记忆法
- 带你读 MySQL 源码:Where 条件怎么过滤记录?
- 有MySQL了,为什么还硬要搭个MongoDB集群?
- MySQL Router高可用搭建,你学会了吗?
- 在 Meta 构建和部署 MySQL Raft
- mysql的3种安装方式及yum安装MySQL的步骤
