项目中可能会存在同时使用jpa的场景和mybatis的场景,比如一些无关联的表,直接使用jpa做增删改查,代码简洁,表达性也强。稍微复杂些的场景,建议使用mybatis,这样方便维护,SQL也可控。
但是两种框架同时使用,会不会增加数据库连接池的数量呢?一起来做个测试吧!
对比法查看连接池的变化:
-
只使用mybatis的情况下,数据库连接池的数量
-
加入jpa的情况后,再查看数据库连接池的变化
实验步骤
-
准备工程
- 启动mysql数据库(半支烟自己本地用docker启动了一个,比较方便)
-
准备一个springboot工程,集成了mybatis,项目地址:https://gitee.com/yclxiao/blog-dbpool
数据源配置和SQL脚本都在工程里,自取
-
配置数据源
# mysql spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=rootpwd # Hikari连接池的设置 ## Hikari 时间单位都是毫秒 spring.datasource.type=com.zaxxer.hikari.HikariDataSource ## 连接池名字 spring.datasource.hikari.pool-name=MyHikariCP ## 最小空闲连接数量,默认是10 spring.datasource.hikari.minimum-idle=5 ## 连接池最大连接数,默认是10 spring.datasource.hikari.maximum-pool-size=20 ## 空闲连接存活最大时间,默认600000(10分钟) spring.datasource.hikari.idle-timeout=600000 ## 此属性控制从池返回的连接的默认自动提交行为,默认值:true spring.datasource.hikari.auto-commit=true ## 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟 spring.datasource.hikari.max-lifetime=1800000 ## 数据库连接超时时间,默认30秒,即30000 spring.datasource.hikari.connection-timeout=30000
-
执行SQL脚本
-- 创建 boot 数据库 CREATE DATABASE IF NOT EXISTS testdb DEFAULT CHARSET utf8 COLLATE utf8_bin; -- 选择 boot 数据库 USE testdb; -- 创建 user 表 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; DROP TABLE IF EXISTS `tb_user`; -- 用户表 CREATE TABLE `testdb`.`tb_user` ( `user_id` varchar(64) NOT NULL COMMENT '用户主键', `user_account` varchar(64) NOT NULL COMMENT '用户注册账户', `user_name` varchar(64) NULL COMMENT '用户名称', `user_phone` varchar(11) NOT NULL COMMENT '用户手机号', `user_pwd` varchar(64) NOT NULL COMMENT '用户密码', `add_time` datetime(0) NOT NULL COMMENT '添加时间', `add_user` varchar(64) NOT NULL COMMENT '添加人编号', `user_role` int(2) NOT NULL COMMENT '用户角色 1管理员 2普通人员', PRIMARY KEY (`user_id`) ); -- 增加索引 ALTER TABLE `testdb`.`tb_user` ADD UNIQUE INDEX `idx_union_account`(`user_account`) USING BTREE, ADD UNIQUE INDEX `idx_union_phone`(`user_phone`) USING BTREE; -- 新增语句 INSERT INTO tb_user(user_id,user_account,user_name,user_phone,user_pwd,add_time,add_user,user_role) VALUES ('U553844920155115520','15850501595','管理员','15850501595','643839d202bf86ab383a650ec1825d44',NOW(),'0',1);
-
使用JMeter测试
后续会有压测,所以这里直接利用JMeter访问应用。根据截图配置请求url,参数,一次请求,请求头,最后执行。
-
使用jconsole查看MBean的情况
可以看出MBean的属性,和项目中的配置是一致的。
-
查看mysql的链接数量
刚开始的连接数量是2,第一次执行查询后,SQL查看当前连接池的数量是8,第一次建了6个数据连接。
-- 查看当前数据库连接数 show status like 'Threads_connected'; -- 查看当前数据库支持的最大连接数 show status like 'Threads_connected';
JMeter的并发数改成6,连接池的数量依旧是8。
并发数 连接池数 6 8 7 9 10 12 100 16 1000 最大值22(20+2) -
关闭应用,增加jpa,重启后再查看连接数
代码调整如下,详情请移动的jpa分支https://gitee.com/yclxiao/blog-dbpool/tree/jpa/
将:
PageResponse<UserPo> pageResponse = userService.queryUserPage(condition);
改为:
PageResponse<UserPo> pageResponse = new PageResponse<>(0, new ArrayList<>()); int num = new Random().nextInt(2); if (num % 2 == 0) { pageResponse = userService.queryUserPage(condition); } else { Pageable pageable = new PageRequest(condition.getPageNum(),condition.getPageSize()); Page<CoursePo> poPage = courseRepository.findAll(pageable); }
并发数 连接池数 6 12 7 12 10 13 15 14 20 16 100 19 1000 22
总结
根据实际测试,同时启用mybatis和jpa后:
-
加载了更多的类,占用了更多的启动时间
-
并发量低的时候,启用了更多的数据库连接
-
并发量高的时候,受限于连接池总数的限制,连接总数相同
实际项目中不建议两种方式混用,即占用更多的资源,也不便于后期的维护。