专业的编程技术博客社区

网站首页 > 博客文章 正文

Springboot2将默认的数据库连接池hikari替换为druid

baijin 2024-10-03 17:34:05 博客文章 4 ℃ 0 评论

前言

什么是数据库连接池?

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。

数据库连接池对比

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 : 数据源名称

# spring.datasource.driverClassName : 数据库驱动

# spring.datasource.url : 数据库连接地址

# spring.datasource.username : 数据库用户名

# spring.datasource.password : 数据库密码

# spring.datasource.type : 数据库类型

# spring.datasource.hikari.pool-name : 数据库连接池名称

# spring.datasource.hikari.minimum-idle : 最小连接数

# spring.datasource.hikari.maximum-pool-size : 最大连接数

# spring.datasource.hikari.auto-commit : 是否自动提交

# spring.datasource.hikari.idle-timeout : 连接闲置超时时间

# spring.datasource.hikari.max-lifetime : 连接在连接池中的存活时间

# spring.datasource.hikari.connection-timeout : 连接数据库超时时间

# spring.datasource.hikari.connection-test-query : 连接测试语句

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 : 数据源名称

# spring.datasource.driverClassName : 数据库驱动

# spring.datasource.url : 数据库连接地址

# spring.datasource.username : 数据库用户名

# spring.datasource.password : 数据库密码

# spring.datasource.type : 数据库类型

# spring.datasource.druid.initial-size : 初始化时建立物理连接的个数.初始化发生在显示调用init方法,或者第一次getConnection时

# spring.datasource.druid.min-idle : 最小连接池数量

# spring.datasource.druid.max-active : 最大连接池数量

# spring.datasource.druid.max-wait : 获取连接时最大等待时间,单位毫秒.配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁

# spring.datasource.druid.time-between-eviction-runs-millis : 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒

# spring.datasource.druid.min-evictable-idle-time-millis : 配置一个连接在池中最小生存的时间,单位是毫秒

# spring.datasource.druid.validation-query : 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'.如果validationQuery为null,testOnBorrow,testOnReturn,testWhileIdle都不会起作用

# spring.datasource.druid.test-on-borrow : 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能

# spring.datasource.druid.test-on-return : 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能

# spring.datasource.druid.test-while-idle : 建议配置为true,不影响性能,并且保证安全性.申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效

# spring.datasource.druid.pool-prepared-statements : 是否缓存preparedStatement,也就是PSCache.PSCache对支持游标的数据库性能提升巨大,比如说oracle.在mysql下建议关闭

# spring.datasource.druid.max-pool-prepared-statement-per-connection-size : 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true.在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100

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的数据库监控。

Tags:

猜你喜欢

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表