【SSM基础】HikaciCP、Druid使用
其他文章可以通过菜单查看:【BookCase 菜单】
1、前言
我们在访问数据库的时候需要创建连接,之后获取数据,然后释放连接。使用数据库连接池可以节省我们创建和释放数据库连接的时间,并对链接创建进行有效管理。
目前常用的数据库连接池为HikaciCP 和 Druid,其中 Druid 是国内开发,HikaciCP 是Springboot 自带数据库连接池。
具体可以查看官网:https://docs.spring.io/spring-boot/docs/current/reference/html/data.html#data
If you use the spring-boot-starter-jdbc or spring-boot-starter-data-jpa “starters”, you automatically get a dependency to HikariCP.
2、使用
2.1、HikariCP
springboot 配置如下:
spring:
application:
name: '@artifactId@'
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
name: defaultDataSource
url: jdbc:mysql://localhost:3306/bookcase?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull
password: root
username: root
type: com.zaxxer.hikari.HikariDataSource
hikari:
## Hikari 连接池配置 ------ 详细配置请访问:https://github.com/brettwooldridge/HikariCP
## 最小空闲连接数量
minimum-idle: 5
## 连接池最大连接数,默认是10
maximum-pool-size: 15
## 此属性控制从池返回的连接的默认自动提交行为,默认值:true
auto-commit: true
## 空闲连接存活最大时间,默认600000(10分钟)
idle-timeout: 30000
## 连接池名称
pool-name: DatebookHikariCP
## 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
max-lifetime: 1800000
## 数据库连接超时时间,默认30秒,即30000
connection-timeout: 30000
## 心跳测试语句
connection-test-query: SELECT 1
HikariCP配置是进行延迟加载的,初始化启动的时候,会进行默认配置HikariDataSource():
public HikariDataSource()
{
super();
fastPathPool=null;
}
当第一次访问数据库的时候会再次执行:
public HikariDataSource(HikariConfig configuration)
{
configuration.validate();
configuration.copyStateTo(this);
LOGGER.info("{} - Starting...", configuration.getPoolName());
pool = fastPathPool = new HikariPool(this);
LOGGER.info("{} - Start completed.", configuration.getPoolName());
this.seal();
}
这里可以在控制台看到启动日志:
[INFO ] [2022-04-07 19:15:53] [HikariDataSource] - DatebookHikariCP - Starting...
[INFO ] [2022-04-07 19:15:54] [HikariDataSource] - DatebookHikariCP - Start completed.
2.2、Druid配置
- 添加依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
配置如下:
spring:
application:
name: '@artifactId@'
#数据源配置
datasource:
druid:
## druid 连接池配置 ------ 详细配置请访问:https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter
initial-size: 5
## 最小空闲连接数量
min-idle: 5
## 连接池最大连接数,默认是10
max-active: 15
# 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
max-wait: 20000
# Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。
time-between-eviction-runs-millis: 60000
# 连接保持空闲而不被驱逐的最小时间
min-evictable-idle-time-millis: 300000
# 用来检测连接是否有效的sql 因数据库方言而差, 例如 oracle 应该写成 SELECT 1 FROM DUAL
validation-query: SELECT 1
# 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
test-on-borrow: false
# 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
test-on-return: false
# 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
test-while-idle: true
filters: config,stat,wall
stat-view-servlet:
enabled: true
url-pattern: /druid/*
login-username: admin
login-password: admin
allow:
deny:
# druid 监控的配置
web-stat-filter:
# 是否开启 WebStatFilter 默认是true
enabled: true
# 需要拦截的url
url-pattern: /*
# 排除静态资源的请求
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
#session统计功能
session-stat-enable: true
#最大session数
session-stat-max-count: 100000
#你可以配置principalSessionName,使得druid能够知道当前的session的用户是谁
principal-session-name: admin
#你可以配置principalSessionName,使得druid能够知道当前的cookie的用户是谁
principal-cookie-name: admin
监控访问:
http://ip:port/druid/index.html
例如:http://localhost:8081/druid/index.html
SpringBoot 的配置还是需要参考github: https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter
3、总结
偏向监控的可以使用druid,国内企业使用的还是挺多的。
如果想讲究效率Spring官方继承HikariCP也挺好,不用重新再引用Jar包。
具体哪个好,标准不同,见仁见智吧。