强大的Druid

简介: Druid数据库连接池介绍以及使用步骤

一 基本原理

一次数据库访问总共分几步?三步:第一步是创建一个连接;第二步是操作数据;第三步是释放连接。对于一个业务动作来说,我们并不关心第一步和第三步,我们真正关心的是第二步——操作数据。为了做一件事情,我们不得不额外做两件我们并不想做的事情。前面讲到的Spring Data JPA和MyBatisPlus将这个问题解决了一半——封装了数据库连接的创建和释放,这样虽然减少了我们的工作量,但仍然有很大的性能开销。因为创建和释放连接的操作都是非常耗时的操作,要解决这个问题,就需要使用数据库连接池了。

在应用初始化的时候,可以根据配置信息预先创建一些数据库连接对象,并存放于内存中。当需要访问数据库的时候,可以直接到连接池中“借”一个连接来用。当完成数据库操作以后,再将这个连接“还”给连接池,从而实现资源共享的目的。近几年很火的共享经济(共享单车、共享汽车、共享充电宝等)不就是这种思路吗?原来这些看起来新鲜的“玩法”早就被程序员们使用过了。

连接池技术避免了频繁创建与释放连接的情况,并且可以根据当前的使用情况来动态增减数据库连接数,做到一定程度上的按需“备货”,使得数据库资源的利用变得更加合理,不仅在速度上有了很大的提升,在稳定性上也得到了改善。

二 如何选择连接池

市面上有很多Java的数据库连接池组件,我们应该如何选择呢?下表所示为主流数据库连接池的对比。
image.png

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默认是关闭监控功能的,我们可以在之前的配置基础上追加以下配置来开启监控功能:
image.png

为了系统安全,开启监控功能后配置好白名单和黑名单。配置好以后,重 启应用就可通过这个地 址访问监控系统了 :http://localhost:8080/druid/index.html

监控系统
登录Druid以后,需要输入我们配置的用户名和MA。
image.png

Druid首页展示的是应用的详细软件信息
image.png

在Druid SQL监控视图中,可以查看SQL的执行情况
image.png

在Druid URL视图中,可以查看每次的请求
image.png

在Druid Spring视图中,可以展示配置的切点执行情况
image.png

打印可执行SQL语句
Druid还有一个非常实用的功能,就是输出可执行SQL语句与SQL语句的执行结果。在默认情况下,打印的SQL语句都是带参数占位符的,例如
image.png

这种形式的SQL语句在排查问题的时候用起来很不方便,简单的SQL语句还好,但是如果其参数很多,想拿过来用是根本不可能的,还不如自己手写的速度快。如果打印出来的SQL语句把参数都设置好了,甚至能将执行结果一起打印出来,那就完美了。Druid就很贴心,为我们提供了这样的功能。具体配置已经在“监控配置”部分给出。我们来看看效果
image.png

可以看到,此时id被设置成了1,最后一行还将我们查询到的数据打印出来了。这个功能真好用!

相关文章
|
6月前
|
监控 druid Java
Druid 的整合
Druid 的整合
100 0
|
druid 数据库
数据库连接池——Druid
数据库连接池——Druid 一、好处 更方便地获取连接对象,效率高 资源可以更好的重复利用
|
存储 SQL druid
什么是Druid
什么是Druid
4498 1
什么是Druid
|
6月前
|
存储 消息中间件 druid
Druid介绍
Druid介绍
|
6月前
|
监控 druid 数据库连接
数据库连接池选择:HikariCP vs Druid
数据库连接池选择:HikariCP vs Druid
|
6月前
|
SQL druid Java
jdbc(数据库连接池druid)
jdbc(数据库连接池druid)
|
12月前
|
SQL 缓存 druid
数据库连接池Druid使用总结
数据库连接池Druid使用总结
164 0
|
druid Java 数据库
数据库连接池 druid
数据库连接池 druid
363 0
数据库连接池 druid
|
SQL 监控 druid
Druid连接池
Druid连接池
447 0
|
druid Java 数据库连接
【JDBC】数据库连接池:德鲁伊druid的使用
学习数据库连接池:德鲁伊druid的使用。
1245 0
【JDBC】数据库连接池:德鲁伊druid的使用