同时使用jpa和mybatis会增加连接池吗

  |   0 评论   |   0 浏览

项目中可能会存在同时使用jpa的场景和mybatis的场景,比如一些无关联的表,直接使用jpa做增删改查,代码简洁,表达性也强。稍微复杂些的场景,建议使用mybatis,这样方便维护,SQL也可控。

但是两种框架同时使用,会不会增加数据库连接池的数量呢?一起来做个测试吧!

对比法查看连接池的变化:

  1. 只使用mybatis的情况下,数据库连接池的数量
  2. 加入jpa的情况后,再查看数据库连接池的变化

实验步骤

  1. 准备工程
    • 启动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);
  1. 使用JMeter测试
    后续会有压测,所以这里直接利用JMeter访问应用。根据截图配置请求url,参数,一次请求,请求头,最后执行。
    image-20200320154204053
    image-20200320154323777
    image-20200320154403480
  2. 使用jconsole查看MBean的情况
    可以看出MBean的属性,和项目中的配置是一致的。
    image-20200320155343067
  3. 查看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。

发数 | 连接池数         |
68
79
1012
10016
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);
}
发数 | 连接池数 |
612
712
1013
1514
2016
10019
100022

总结

根据实际测试,同时启用mybatis和jpa后:

  1. 加载了更多的类,占用了更多的启动时间
  2. 并发量低的时候,启用了更多的数据库连接
  3. 并发量高的时候,受限于连接池总数的限制,连接总数相同

实际项目中不建议两种方式混用,即占用更多的资源,也不便于后期的维护。


标题:同时使用jpa和mybatis会增加连接池吗
作者:程序员半支烟
地址:http://mangod.top/articles/2023/03/15/1678873682210.html