前言
什么是数据库连接池?
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
数据库连接池对比
Druid:
Druid是Java语言中最好的数据库连接池,Druid能够提供强大的监控和扩展功能,是一个可用于大数据实时查询和分析的高容错、高性能的开源分布式系统,尤其是当发生代码部署、机器故障以及其他产品系统遇到宕机等情况时,Druid仍能够保持100%正常运行。主要特色:为分析监控设计;快速的交互式查询;高可用;可扩展;Druid是一个开源项目,源码托管在github上。
HikariCP:
HikariCP通过优化(concurrentBag,fastStatementList )集合来提高并发的读写效率。并且使用threadlocal缓存连接及大量使用CAS的机制,最大限度的避免lock。单可能带来cpu使用率的上升。HikariCP从字节码的维度优化代码。 (default inline threshold for a JVM running the server Hotspot compiler is 35 bytecodes )让方法尽量在35个字节码一下,来提升jvm的处理效率。
未来到底是Druid还是HikariCP的天下?
其实这个是根据自己的需求来选择的。Druid监控做的好,当然也快。而HikariCP的特定就是快。所以我的经验是需要监控的时候选择Druid,否则选HikariCP。
之前整合MyBatis的时候由于SpringBoot的默认连接池就是使用HikariCP,所以本文主要讲解如何替换hikari为druid
编码
1.添加druid依赖
由于SpringBoot默认采用hikari连接池,因此添加druid依赖后我们会去除hikari依赖
编辑pom.xml文件
将
<dependency >
<groupId > org.mybatis.spring.boot</groupId >
<artifactId > mybatis-spring-boot-starter</artifactId >
<version > 2.1.1</version >
</dependency >
修改为
<dependency >
<groupId > org.mybatis.spring.boot</groupId >
<artifactId > mybatis-spring-boot-starter</artifactId >
<version > 2.1.1</version >
<exclusions >
<exclusion >
<groupId > com.zaxxer</groupId >
<artifactId > HikariCP</artifactId >
</exclusion >
</exclusions >
</dependency >
<dependency >
<groupId > com.alibaba</groupId >
<artifactId > druid-spring-boot-starter</artifactId >
<version > 1.1.21</version >
</dependency >
2.修改SpringBoot的配置文件application.properties
将
spring.datasource.name=mysqlDataSource
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springBoot2?useUnicode=true &characterEncoding=utf-8&useSSL=true &serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.pool-name=hikariPool
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.connection-test-query=SELECT 1
替换为
spring.datasource.name=mysqlDataSource
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springBoot2?useUnicode=true &characterEncoding=utf-8&useSSL=true &serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.initial-size=2
spring.datasource.druid.min-idle=2
spring.datasource.druid.max-active=20
spring.datasource.druid.max-wait=60000
spring.datasource.druid.time-between-eviction-runs-millis=60000
spring.datasource.druid.min-evictable-idle-time-millis=300000
spring.datasource.druid.validation-query=SELECT 'x'
spring.datasource.druid.test-on-borrow=false
spring.datasource.druid.test-on-return=false
spring.datasource.druid.test-while-idle=true
spring.datasource.druid.pool-prepared-statements=false
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
3.测试结果
运行项目,并且访问[http://127.0.0.1:8080/mybatis] 。结果如下图所示
说明:本文仅仅替换了一个数据库连接池,对正常的持久化数据并无影响。所以之前编写的MyBatis代码还是能运行成功。当然druid连接池最擅长的监控本文还未讲解。但是放心,后续会有文章讲解druid的数据库监控。