spring boot系列(五)集成Druid数据源

让人想犯罪 __ 提交于 2020-08-09 05:58:17

数据库连接池

连接池的思想就是建立一个"缓存池",预先存放一定数量的连接,当需要建立数据库连接时,就从"缓存池"中取出一个,用完之后再放入池中。

连接池是怎么管理、分配连接对象呢?

使用一个"空闲池"管理已经被创建但未被使用的连接,当有一个新的连接请求时,首先再"空闲池"中寻找空闲的连接对象,如果池中有空闲连接对象,就把空闲时间最长的那个连接对象取出来分配(前提是这个对象是有效的),如果这个对象不可用,就将其从"空闲池"中删除,重新检测。如果没有检测到可用连接,则判断当前连接数是否达到最大连接数,如果没有,则创建新的连接,如果达到最大连接数,则进入等待。如果在等待的时间内,检测到可用的连接,则进行分配,如果超时还未检测到可用连接,则返回null。系统只对所创建的连接进行计数统计,对于检测可用连接,可开辟线程(提示响应速度,增加系统开销)、也可在分配前进行检测。


Druid

Durid是阿里开源的JDBC应用组件,包括三部分:

  • DruidDriver:代理Driver,能提供基于Filter-Chian模式的插件系统
  • DruidDataoSource:高效可管理的数据库连接池
  • SQLParser:SQL语法分析

通过Druid连接池中间件,可以实现:

  • 可监控的数据库访问的性能,Druid提供了一个强大的StatFilter插件,能详细的统计SQL执行性能,对于线上分析数据库访问性能非常有利
  • 替换传统的==DBCP==和==C3P0==中间件。提供一个高效、功能强大、可监控的数据库连接池
  • 数据库密码加密。直接把数据库密码写入配置文件中,会存在极大的安全问题,DruidDriver和DruidDataSource都支持PasswordCallBack。
  • SQL执行日志。Druid提供了不同的LogFilter,能够支持==Common-Logging==、==Log4j==和==jdkLog==,可按需选择日志框架
  • 扩展JDBC。如果对JDBC层有编程需求、可通过Druid提供的Filter-Chain机制,方便编写JDBC扩展插件

Druid文档

Druid官方文档


案例

pom.xml中添加依赖

        <!--Druid依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.9</version>
        </dependency>


修改数据源配置

   datasource:
     name: druidDataSource
     type: com.alibaba.druid.pool.DruidDataSource
     druid:
       driver-class-name: com.mysql.cj.jdbc.Driver
       url: jdbc:mysql://192.168.1.8:3306/studenms?useUnicode=true&zeroDateTimeBehavior=CONVERT_TO_NULL&autoReconnect=true&characterEncoding=utf-8&serverTimezone=UTC
       username: root
       password: sa
       filters: stat,wall,log4j,config
       max-active: 100
       initial-size: 1
       max-wait: 60000
       min-idle: 1
       time-between-eviction-runs-millis: 60000
       min-evictable-idle-time-millis: 30000
       validation-query: select 'X'
       test-while-idle: true
       test-on-borrow: false
       test-on-return: false
       max-pool-prepared-statement-per-connection-size: 20
       max-open-prepared-statements: 50
       
       # 配置监控服务器
       stat-view-servlet:
         # 这里一定要配置true,不配置则是使用默认值false,空白页面
         enabled: true
         login-username: root
         login-password: sa
         reset-enable: false
         url-pattern: /druid/*

参数说明

  • max-active:最大连接数
  • initial-size: 初始化连接数
  • min-idle:最小连接数
  • max-wait:等待最长时间
  • time-between-eviction-runs-millis:间隔多久检测一次
  • min-evictable-idle-time-millis:一个连接池最小的生存时间
  • filters: stat,wall,log4j,config,配置监控统计拦截的filers,如果没有,则监控界面无法统计,‘wall’用于防火墙

Druid提供以下几种Filter

Druid-spring-boot-starter简化了一些配置,如果需要自定义配置,参考Druid-spring-boot-starte自定义配置


测试

浏览器输入localhost:8090/druid,会自动跳转到登录界面

输入监控服务配置中的login-username和login-password,进入控制台页面

测试接口

执行分页查询的接口

进入控制台,查看SQL监控。

从SQL监控发现,执行了2条SQL。调用一个接口,执行了2条SQL,这是为什么?

答:刚才说到这是分页查询接口,使用mybatis分页查询时,要写2条SQL,一条查询Count(*),一条是分页查询。由于接口使用了pagehelper插件,它简化了mybatis的sql,开发者只用写一条查询所有数据的SQL,它会自动拦截,进行分页,因此实际上是执行了2条SQL。

同时从图中还发现发现,执行select count(*)语句耗时14毫秒,druid给出了"最慢"提示。实际上这张表只有3行,7个字段。由此可见select count()要慎用。

还可以看到url的监控,具体执行了哪些api接口,这里都可以查看


问题

1.出现如下错误信息,是缺少log4j依赖,在pom.xml引入依赖,即可

  1. druid监控页面空白

检查==stat-view-servlet==监控服务配置是否开启,将enable设置为true

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!