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

燃着的半支烟 2020年03月20日 88次浏览

项目中可能会存在同时使用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);
      
  2. 使用JMeter测试

    后续会有压测,所以这里直接利用JMeter访问应用。根据截图配置请求url,参数,一次请求,请求头,最后执行。

    image-20200320154204053 image-20200320154323777 image-20200320154403480
  3. 使用jconsole查看MBean的情况

    可以看出MBean的属性,和项目中的配置是一致的。

    image-20200320155343067

  4. 查看mysql的链接数量

    刚开始的连接数量是2,第一次执行查询后,SQL查看当前连接池的数量是8,第一次建了6个数据连接。

    -- 查看当前数据库连接数
    show status like 'Threads_connected';
    -- 查看当前数据库支持的最大连接数
    show status like 'Threads_connected';
    

    image-20200320155134035

    image-20200320160600352

    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. 并发量高的时候,受限于连接池总数的限制,连接总数相同

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