jdbc中自带MySQL 连接池实践示例


Posted in MySQL onJuly 23, 2022

引言

在上期文章自定义 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 倒是挺多的,但是大多数都用不到。

package com.funtest.groovytest
import com.funtester.frame.SourceCode
import com.mysql.cj.jdbc.MysqlConnectionPoolDataSource
class MysqlPoolTe extends SourceCode {
    public static void main(String[] args) {
        def query = "select * from testers limit 2;"
        def source = new MysqlConnectionPoolDataSource()
        source.setServerName("localhost")
        source.setPort(3306)
        source.setUser("root")
        source.setPassword("root123456")
        source.setDatabaseName("funtester")
        source.setAllowMultiQueries(true)
        def connection = source.getPooledConnection()
        def statement = connection.getConnection().createStatement()
        while (true) {
            sleep(1)
            def query = statement.executeQuery(query)
            while (query.next()) {
                output query.getString("name")
            }
        }
    }
}

这里有个很容易的坑,就是有个setURL()还有一个setUrl(),其实这两个没有任何区别,我只能说可能为了兼容旧版本把。还有就是设置了 URL 之后,好像 database 设置不起作用了,也是妙明感觉设计真糟心,所以在上面的案例中我也没有用到这俩方法。

下面是我的测试结果,如图所示创建了超级多的线程,但是一直连接的只有很少。大概是经过几秒钟就会被回收一次,但是总创建数依旧非常高。

jdbc中自带MySQL 连接池实践示例

以后大概率我不会使用这个com.mysql.cj.jdbc.MysqlConnectionPoolDataSource实现类,依旧会继续完善自己的连接池功能。

以上就是jdbc中自带MySQL 连接池实践示例的详细内容,更多关于jdbc MySQL 连接池的资料请关注三水点靠木其它相关文章!


Tags in this post...

MySQL 相关文章推荐
MySQL中VARCHAR与CHAR格式数据的区别
May 26 MySQL
Mysql数据库值的添加、修改、删除及清空操作实例
Jun 20 MySQL
MySQL如何使用使用Xtrabackup进行备份和恢复
Jun 21 MySQL
MySQL系列之十五 MySQL常用配置和性能压力测试
Jul 02 MySQL
通过shell脚本对mysql的增删改查及my.cnf的配置
Jul 07 MySQL
MySQL悲观锁与乐观锁的实现方案
Nov 02 MySQL
解决Mysql多行子查询的使用及空值问题
Jan 22 MySQL
mysql下的max_allowed_packet参数设置详解
Feb 12 MySQL
Arthas排查Kubernetes中应用频繁挂掉重启异常
Feb 28 MySQL
MySQL高级进阶sql语句总结大全
Mar 16 MySQL
MySQ InnoDB和MyISAM存储引擎介绍
Apr 26 MySQL
MySQL优化之慢日志查询
Jun 10 MySQL
MySQL池化框架学习接池自定义
Jul 23 #MySQL
mysql sock文件存储了什么信息
Jul 15 #MySQL
mysql sock 文件解析及作用讲解
Jul 15 #MySQL
mysqldump进行数据备份详解
Jul 15 #MySQL
MySQL的表级锁,行级锁,排它锁和共享锁
Jul 15 #MySQL
MySQL事务的隔离级别详情
Jul 15 #MySQL
MySQL事务的ACID特性以及并发问题方案
Jul 15 #MySQL
You might like
PHP限制页面只能在微信自带浏览器访问的代码
2014/01/15 PHP
php顺序查找和二分查找示例
2014/03/27 PHP
JavaScript 继承使用分析
2011/05/12 Javascript
Js判断参数(String,Array,Object)是否为undefined或者值为空
2013/11/04 Javascript
jQuery:delegate中select()不起作用的解决方法(实例讲解)
2014/01/26 Javascript
JQuery中上下文选择器实现方法
2015/05/18 Javascript
Js数组排序函数sort()介绍
2015/06/08 Javascript
JQuery实现鼠标移动图片显示描述层的方法
2015/06/25 Javascript
实例讲解Jquery中隐藏hide、显示show、切换toggle的用法
2016/05/13 Javascript
浅谈html转义及防止javascript注入攻击的方法
2016/12/04 Javascript
echarts3 使用总结(绘制各种图表,地图)
2017/01/05 Javascript
js前端日历控件(悬浮、拖拽、自由变形)
2017/03/02 Javascript
分析JS单线程异步io回调的特性
2017/12/01 Javascript
浅谈Node.js 子进程与应用场景
2018/01/24 Javascript
小程序和web画三角形实现解析
2019/09/02 Javascript
详解vue中使用axios对同一个接口连续请求导致返回数据混乱的问题
2019/11/06 Javascript
Vue中rem与postcss-pxtorem的应用详解
2019/11/20 Javascript
javascript实现留言板功能
2020/02/08 Javascript
JavaScript中常用的3种弹出提示框(alert、confirm、prompt)
2020/11/10 Javascript
Python列表生成器的循环技巧分享
2015/03/06 Python
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
2018/01/07 Python
Python BS4库的安装与使用详解
2018/08/08 Python
Python 实现Numpy中找出array中最大值所对应的行和列
2019/11/26 Python
Python实现手机号自动判断男女性别(实例解析)
2019/12/22 Python
Python开发之基于模板匹配的信用卡数字识别功能
2020/01/13 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
2020/03/26 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
2020/04/26 Python
使用openCV去除文字中乱入的线条实例
2020/06/02 Python
pycharm 代码自动补全的实现方法(图文)
2020/09/18 Python
HTML5声音录制/播放功能的实现代码
2018/05/03 HTML / CSS
德国自然时尚和有机产品购物网站:Waschbär
2019/05/29 全球购物
加拿大领先的时尚和体育零售商:Sporting Life
2019/12/15 全球购物
村捐赠仪式答谢词
2014/01/21 职场文书
公司处罚决定书
2015/06/24 职场文书
2015年国庆放假通知范文
2015/08/18 职场文书
Vue3如何理解ref toRef和toRefs的区别
2022/02/18 Vue.js