jdbc 自带 MySQL 连接池实践
在上期文章自定义MySQL连接池中,我提到了没找到一个特别合适的 MySQL 连接池实现,所以自己写了一个基于通用池化框架commons-pool2
的 MySQL 连接池,并且模仿了 Go 语言的gorm
框架设计思路,把借和还的操作不暴露给用户,只处理用户发来的 SQL 语句的思路,封装了一个com.funtester.db.mysql.MysqlPool
。
可惜打脸的事情来的太快了,在录制视频的时候偶然发现了 Intellij 代码提示有个com.mysql.cj.jdbc.MysqlConnectionPoolDataSource
的类。这还了得,看名字就知道是我想要的那款。
经过查阅资料,好像也没搜到太多详细的资料。看官方的文档,也是遮遮掩掩,仿佛并不很推荐这个实现。关于 MySQL 连接池的管理,在 spring 语境下,应该有相当多更好的实践。但是对于测试来讲,那些太重,不太适合脚本化使用。不管怎样,我还是注意到了这个 MySQL 连接池的实现类。
关于它的名字,我在 stackoverflow 看到有人讨论,表示说叫它 MySQL 连接池并不恰当,因为它只是高效管理了连接的资源使用,并没有池化。这一点在我实测中也发现了,使用获取连接的时候,一直都是在创建新的连接。然后再连接空闲时间超过了设置之后,回收掉这个连接,回收的方法就是调用close()
方法。
对于一般池化技术来讲,就是为了解决重用问题。如果连接并不重用,而是进行高效资源回收管理,其实并不算一个非常优秀的解决方案。
下面是com.mysql.cj.jdbc.MysqlConnectionPoolDataSource
使用实践,比较简单,API 倒是挺多的,但是大多数都用不到。
这里有个很容易的坑,就是有个setURL()
还有一个setUrl()
,其实这两个没有任何区别,我只能说可能为了兼容旧版本把。还有就是设置了 URL 之后,好像 database 设置不起作用了,也是妙明感觉设计真糟心,所以在上面的案例中我也没有用到这俩方法。
下面是我的测试结果,如图所示创建了超级多的线程,但是一直连接的只有很少。大概是经过几秒钟就会被回收一次,但是总创建数依旧非常高。
以后大概率我不会使用这个com.mysql.cj.jdbc.MysqlConnectionPoolDataSource
实现类,依旧会继续完善自己的连接池功能。
BUG 挖掘机·性能征服者·头顶锅盖
阅读原文,跳转我的仓库地址
版权声明: 本文为 InfoQ 作者【FunTester】的原创文章。
原文链接:【http://xie.infoq.cn/article/2feafd4b1fb318140d82c0744】。文章转载请联系作者。
评论