一 基本原理
一次数据库访问总共分几步?三步:第一步是创建一个连接;第二步是操作数据;第三步是释放连接。对于一个业务动作来说,我们并不关心第一步和第三步,我们真正关心的是第二步——操作数据。为了做一件事情,我们不得不额外做两件我们并不想做的事情。前面讲到的Spring Data JPA和MyBatisPlus将这个问题解决了一半——封装了数据库连接的创建和释放,这样虽然减少了我们的工作量,但仍然有很大的性能开销。因为创建和释放连接的操作都是非常耗时的操作,要解决这个问题,就需要使用数据库连接池了。
在应用初始化的时候,可以根据配置信息预先创建一些数据库连接对象,并存放于内存中。当需要访问数据库的时候,可以直接到连接池中“借”一个连接来用。当完成数据库操作以后,再将这个连接“还”给连接池,从而实现资源共享的目的。近几年很火的共享经济(共享单车、共享汽车、共享充电宝等)不就是这种思路吗?原来这些看起来新鲜的“玩法”早就被程序员们使用过了。
连接池技术避免了频繁创建与释放连接的情况,并且可以根据当前的使用情况来动态增减数据库连接数,做到一定程度上的按需“备货”,使得数据库资源的利用变得更加合理,不仅在速度上有了很大的提升,在稳定性上也得到了改善。
二 如何选择连接池
市面上有很多Java的数据库连接池组件,我们应该如何选择呢?下表所示为主流数据库连接池的对比。
Druid是阿里巴巴公司出品的一款非常优秀的数据库连接池组件,拥有强大的监控功能,同时保证了非常好的性能,并且其稳定性经过了阿里巴巴公司内部成千上万次的系统验证,还经受过历年“双十一”活动的考验。这些都足以说明Druid是一款兼具性能与稳定性的优秀数据库连接池组件,因此我们可以放心地使用它。
三 配置
Druid和Spring Boot的集成也非常简单
- 添加pom依赖
- 添加配置。
添加pom依赖
添加Druid的starter的引用:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
添加配置
spring:
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/springboot?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
# 初始化大小、最大、最小
initialSize: 5
minIdle: 5
maxActive: 20
# 配置获取连接等待超时时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在连接池里的最小生存时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1
testWhileIdle: true
# 申请连接时执行validationQuery,检测连接是否有效
testOnBorrow: false
# 归还连接时执行validationQuery,检测连接是否有效
testOnReturn: false
# 打开PSCache。并且指定每个连接上PSCache连接大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 监控配置信息
stat-view-servlet:
# 开启监控页面
enabled: true
# login-username: druid #监控系统用户名
# login-password: 123456 #监控系统密码
# 是否允许清空监控数据
reset-enable: true
#监控系统路径
url-pattern: "/druid/*"
# allow: 127.0.0.1 # 可访问监控系统的ip地址列表(白名单)
filters: stat,wall,slf4j
# 用来打开sql参数化合并监控和慢sql记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
useGlobalDataSourceStat: true
web-stat-filter:
enabled: true
url-pattern: /*
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
profile-enable: true
aop-patterns: com.shuijing.boot.*.controller.*,com.shuijing.boot.*.service.*,com.shuijing.boot.*.mapper.*
filter:
slf4j:
enabled: true
statement-executable-sql-log-enable: true
只要两步就配置好了,比“把大象放冰箱”还简单。启动程序后,控制台输出Init DruidDataSource的字样,说明Druid配置成功。
四 监控
监控配置
前面提到过,Druid具有强大的监控功能,而这也是它的主要功能。出于安全考虑,Druid默认是关闭监控功能的,我们可以在之前的配置基础上追加以下配置来开启监控功能:
为了系统安全,开启监控功能后配置好白名单和黑名单。配置好以后,重 启应用就可通过这个地 址访问监控系统了 :http://localhost:8080/druid/index.html
监控系统
登录Druid以后,需要输入我们配置的用户名和MA。
Druid首页展示的是应用的详细软件信息
在Druid SQL监控视图中,可以查看SQL的执行情况
在Druid URL视图中,可以查看每次的请求
在Druid Spring视图中,可以展示配置的切点执行情况
打印可执行SQL语句
Druid还有一个非常实用的功能,就是输出可执行SQL语句与SQL语句的执行结果。在默认情况下,打印的SQL语句都是带参数占位符的,例如
这种形式的SQL语句在排查问题的时候用起来很不方便,简单的SQL语句还好,但是如果其参数很多,想拿过来用是根本不可能的,还不如自己手写的速度快。如果打印出来的SQL语句把参数都设置好了,甚至能将执行结果一起打印出来,那就完美了。Druid就很贴心,为我们提供了这样的功能。具体配置已经在“监控配置”部分给出。我们来看看效果
可以看到,此时id被设置成了1,最后一行还将我们查询到的数据打印出来了。这个功能真好用!