同时使用jpa和mybatis会增加连接池吗
项目中可能会存在同时使用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';
![image-20200320155134035](http://img.mangod.top/blog/2020-03-20-075136.png)
![image-20200320160600352](http://img.mangod.top/blog/2020-03-20-080602.png)
JMeter的并发数改成6,连接池的数量依旧是8。
发数 | 连接池数 |
6 | 8 |
7 | 9 |
10 | 12 |
100 | 16 |
1000 | 最大值22(20+2) |
5. 关闭应用,增加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后:
- 加载了更多的类,占用了更多的启动时间
- 并发量低的时候,启用了更多的数据库连接
- 并发量高的时候,受限于连接池总数的限制,连接总数相同
实际项目中不建议两种方式混用,即占用更多的资源,也不便于后期的维护。