Druid简介

Java程序很大一部分要操作数据库,为了进步性能操作数据库的时候,又不得不应用数据库连接池。

Druid 是阿里巴巴开源平台上一个数据库连接池实现,联合了 C3P0、DBCP 等 DB 池的长处,同时退出了日志监控。

Druid 能够很好的监控 DB 池连贯和 SQL 的执行状况,天生就是针对监控而生的 DB 连接池。

Druid曾经在阿里巴巴部署了超过600个利用,通过一年多生产环境大规模部署的严苛考验。

Spring Boot 2.0 以上默认应用 Hikari 数据源,能够说 Hikari 与 Driud 都是以后 Java Web 上最优良的数据源,咱们来重点介绍 Spring Boot 如何集成 Druid 数据源,如何实现数据库监控。

Github地址:https://github.com/alibaba/dr...

官网wiki:wiki

简略应用

Spring Boot默认的数据源是

  • 2.0之前org.apache.tomcat.jdbc.pool.DataSource
  • 2.0及之后: com.zaxxer.hikari.HikariDataSource

在springboot中切换数据源非常简单,只须要在配置文件中指定 spring.datasource.type为咱们指定的类型就好了。

eg:spring.datassource.type=com.alibaba.druid.pool.DruidDataSource

这样就实现切换咱们的数据源为Druid。这个type的值是DataSource的接口的实现。

Druid各项配置

配置缺省值阐明
name配置这个属性的意义在于,如果存在多个数据源,监控的时候能够通过名字来辨别开来。如果没有配置,将会生成一个名字,格局是:”DataSource-“ + System.identityHashCode(this). 另外配置此属性至多在1.0.5版本中是不起作用的,强行设置name会出错。
url连贯数据库的url,不同数据库不一样。例如: mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
username连贯数据库的用户名
password连贯数据库的明码。如果你不心愿明码间接写在配置文件中,能够应用ConfigFilter。具体看这里
driverClassName依据url自动识别这一项可配可不配,如果不配置druid会依据url自动识别dbType,而后抉择相应的driverClassName
initialSize0初始化时建设物理连贯的个数。初始化产生在显示调用init办法,或者第一次getConnection时
maxActive8最大连接池数量
maxIdle8曾经不再应用,配置了也没成果
minIdle最小连接池数量
maxWait获取连贯时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用偏心锁,并发效率会有所降落,如果须要能够通过配置useUnfairLock属性为true应用非偏心锁。
poolPreparedStatementsfalse是否缓存preparedStatement,也就是PSCache。PSCache对反对游标的数据库性能晋升微小,比如说oracle。在mysql下倡议敞开。
maxPoolPreparedStatementPerConnectionSize-1要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements主动触发批改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,能够把这个数值配置大一些,比如说100
validationQuery用来检测连贯是否无效的sql,要求是一个查问语句,罕用select ‘x’。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。
validationQueryTimeout单位:秒,检测连贯是否无效的超时工夫。底层调用jdbc Statement对象的void setQueryTimeout(int seconds)办法
testOnBorrowtrue申请连贯时执行validationQuery检测连贯是否无效,做了这个配置会升高性能。
testOnReturnfalse偿还连贯时执行validationQuery检测连贯是否无效,做了这个配置会升高性能。
testWhileIdlefalse倡议配置为true,不影响性能,并且保障安全性。申请连贯的时候检测,如果闲暇工夫大于timeBetweenEvictionRunsMillis,执行validationQuery检测连贯是否无效。
keepAlivefalse (1.0.28)连接池中的minIdle数量以内的连贯,闲暇工夫超过minEvictableIdleTimeMillis,则会执行keepAlive操作。
timeBetweenEvictionRunsMillis1分钟(1.0.14)有两个含意: 1) Destroy线程会检测连贯的间隔时间,如果连贯闲暇工夫大于等于minEvictableIdleTimeMillis则敞开物理连贯。 2) testWhileIdle的判断根据,具体看testWhileIdle属性的阐明
numTestsPerEvictionRun30分钟(1.0.14)不再应用,一个DruidDataSource只反对一个EvictionRun
minEvictableIdleTimeMillis连贯放弃闲暇而不被驱赶的最小工夫
connectionInitSqls物理连贯初始化的时候执行的sql
exceptionSorter依据dbType自动识别当数据库抛出一些不可复原的异样时,摈弃连贯
filters属性类型是字符串,通过别名的形式配置扩大插件,罕用的插件有: 监控统计用的filter:stat 日志用的filter:log4j 进攻sql注入的filter:wall
proxyFilters类型是List<com.alibaba.druid.filter.Filter>,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系

不应用启动器

  • 增加依赖
<!--jdbc--><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-jdbc</artifactId></dependency><!--Druid--><dependency>    <groupId>com.alibaba</groupId>    <artifactId>druid</artifactId>    <version>1.1.22</version></dependency><!--mysql驱动--><dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <scope>runtimen</scope></dependency><!--web--><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId></dependency><!--test--><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-test</artifactId></dependency>
  • 批改配置

咱们只有在配置文件中指定咱们的数据源的类型为Druid就能够切换到Druid:

spring:  datasource:    driver-class-name: com.mysql.cj.jdbc.Driver    url: jdbc:mysql://localhost:3306/study_springboot?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8    username: root    password: root    # 指定类型为咱们本人的    type: com.alibaba.druid.pool.DruidDataSource
  • 测试,打印出数据源
 @Testpublic void load(){    System.out.println(dataSource.getClass());}

能够看到:

这就阐明咱们援用胜利了!

配置文件

这是残缺的配置文件,因为不是应用starter,所以属性不会主动拆卸,须要咱们写配置类。

spring:  datasource:    driver-class-name: com.mysql.cj.jdbc.Driver    url: jdbc:mysql://localhost:3306/study_springboot?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8    username: root    password: root    type: com.alibaba.druid.pool.DruidDataSource    #Spring Boot 默认是不注入这些属性值的,须要本人绑定    #druid 数据源专有配置    # 初始化大小,最小,最大    initialSize: 5    minIdle: 5    maxActive: 200    # 配置获取连贯期待超时的工夫    maxWait: 60000    # 配置距离多久才进行一次检测,检测须要敞开的闲暇连贯,单位是毫秒    timeBetweenEvictionRunsMillis: 60000    # 配置一个连贯在池中最小生存的工夫,单位是毫秒    minEvictableIdleTimeMillis: 300000    # 用来检测连贯是否无效的sql,要求是一个查问语句    validationQuery: SELECT 1 FROM DUAL    # 倡议配置为true,不影响性能,并且保障安全性。申请连贯的时候检测,如果闲暇工夫大于timeBetweenEvictionRunsMillis,执行validationQuery检测连贯是否无效。    testWhileIdle: true    # 申请连贯时执行validationQuery检测连贯是否无效,做了这个配置会升高性能    testOnBorrow: false    # 偿还连贯时执行validationQuery检测连贯是否无效,做了这个配置会升高性能。    testOnReturn: false    # 是否缓存preparedStatement,也就是PSCache。PSCache对反对游标的数据库性能晋升微小,比如说oracle。在mysql下倡议敞开。    poolPreparedStatements: true    # 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements主动触发批改为true。    max-pool-prepared-statement-per-connection-size: 50    #配置监控统计拦挡的filters,stat:监控统计、log4j:日志记录、wall:进攻sql注入    #如果容许时报错  java.lang.ClassNotFoundException: org.apache.log4j.Priority    #则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j    filters: stat,wall,log4j    # 合并多个DruidDataSource的监控数据    useGlobalDataSourceStat: true    # 通过connectProperties属性来关上mergeSql性能;慢SQL记录    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
  • 配置类
@Configurationpublic class DruidConfig {    /*       将自定义的 Druid数据源增加到容器中,不再让 Spring Boot 主动创立       绑定全局配置文件中的 druid 数据源属性到 com.alibaba.druid.pool.DruidDataSource从而让它们失效       @ConfigurationProperties(prefix = "spring.datasource"):作用就是将 全局配置文件中       前缀为 spring.datasource的属性值注入到 com.alibaba.druid.pool.DruidDataSource 的同名参数中     */    @ConfigurationProperties(prefix = "spring.datasource")    @Bean    public DataSource druidDataSource() {        return new DruidDataSource();    }}
  • 测试

咱们通过获取数据源的属性来判断刚刚的设置是否失效

    @Test    public void contextLoads() throws SQLException {        //看一下默认数据源        System.out.println(dataSource.getClass());        //取得连贯        Connection connection =   dataSource.getConnection();        System.out.println(connection);        DruidDataSource druidDataSource = (DruidDataSource) dataSource;        System.out.println("druidDataSource 数据源最大连接数:" + druidDataSource.getMaxActive());        System.out.println("druidDataSource 数据源初始化连接数:" + druidDataSource.getInitialSize());        //敞开连贯        connection.close();    }

能够看到,咱们设置的属性曾经配置进去了:

应用starter启动器

Druid官网已提供启动器了,咱们只有应用启动器,就能实现springboot的主动拆卸,就不须要再通过配置类去注入咱们的bean了。

官网starter教程

  • 增加依赖
<!--Druid starter--><dependency>    <groupId>com.alibaba</groupId>    <artifactId>druid-spring-boot-starter</artifactId>    <version>1.1.22</version></dependency>
  • 增加配置

druid中默认的配置都是以spring.datasource.druid.*结尾的,所以咱们只有在配置文件中配置属性就好就好,不须要再写配置类去绑定配置信息:

spring:  datasource:    driver-class-name: com.mysql.cj.jdbc.Driver    url: jdbc:mysql://localhost:3306/study_springboot?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8    username: root    password: root    type: com.alibaba.druid.pool.DruidDataSource        druid:    #druid 数据源专有配置    # 初始化大小,最小,最大      initialSize: 5      minIdle: 5      maxActive: 200      # 配置获取连贯期待超时的工夫      maxWait: 60000      # 配置距离多久才进行一次检测,检测须要敞开的闲暇连贯,单位是毫秒      timeBetweenEvictionRunsMillis: 60000      # 配置一个连贯在池中最小生存的工夫,单位是毫秒      minEvictableIdleTimeMillis: 300000      # 用来检测连贯是否无效的sql,要求是一个查问语句      validationQuery: SELECT 1 FROM DUAL      # 倡议配置为true,不影响性能,并且保障安全性。申请连贯的时候检测,如果闲暇工夫大于timeBetweenEvictionRunsMillis,执行validationQuery检测连贯是否无效。      testWhileIdle: true      # 申请连贯时执行validationQuery检测连贯是否无效,做了这个配置会升高性能      testOnBorrow: false      # 偿还连贯时执行validationQuery检测连贯是否无效,做了这个配置会升高性能。      testOnReturn: false      # 是否缓存preparedStatement,也就是PSCache。PSCache对反对游标的数据库性能晋升微小,比如说oracle。在mysql下倡议敞开。      poolPreparedStatements: true      # 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements主动触发批改为true。      max-pool-prepared-statement-per-connection-size: 50        #配置监控统计拦挡的filters,stat:监控统计、log4j:日志记录、wall:进攻sql注入      #如果容许时报错  java.lang.ClassNotFoundException: org.apache.log4j.Priority      #则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j      # 配置监控统计拦挡的filters,去掉后监控界面sql无奈统计,比方不配置stat,咱们在Druid的监控页面中就拿不到想要的信息。      filters: stat,wall,log4j      # 合并多个DruidDataSource的监控数据      useGlobalDataSourceStat: true      # 通过connectProperties属性来关上mergeSql性能;慢SQL记录      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

这样咱们刚刚的DruidConfig就能够不要了,再次启动测试类,发现也是失常读取到咱们的自定义配置:

这个时候咱们拜访localhost:8080/druid,就能够进入druid默认的监控控制台。

配置多数据源

参考官网文档即可

配置Druid监控

Druid 数据源具备监控的性能,并提供了一个 web 界面不便用户查看,相似装置 路由器 时,人家也提供了一个默认的 web 页面。然而这个页面默认是所有人都能够拜访,不平安,所以个别咱们都要定制的去设置。

对于Spring Boot有两种配置形式,一种是基于配置类,一种是间接在配置文件中配置。

间接在配置文件中配置

比方间接在配置文件中配置如下,其余的配置也雷同,能够看官网:

# WebStatFilter配置,阐明请参考Druid Wiki,配置_配置WebStatFilter# 次要进行配置哪些申请须要druid监控,哪些不须要spring.datasource.druid.web-stat-filter.enabled= #是否启用StatFilter默认值falsespring.datasource.druid.web-stat-filter.url-pattern=spring.datasource.druid.web-stat-filter.exclusions=spring.datasource.druid.web-stat-filter.session-stat-enable=spring.datasource.druid.web-stat-filter.session-stat-max-count=spring.datasource.druid.web-stat-filter.principal-session-name=spring.datasource.druid.web-stat-filter.principal-cookie-name=spring.datasource.druid.web-stat-filter.profile-enable=# StatViewServlet配置,阐明请参考Druid Wiki,配置_StatViewServlet配置spring.datasource.druid.stat-view-servlet.enabled= #是否启用StatViewServlet默认值false#申请门路spring.datasource.druid.stat-view-servlet.url-pattern=spring.datasource.druid.stat-view-servlet.reset-enable=# 设置登录用户spring.datasource.druid.stat-view-servlet.login-username=# 设置登录明码spring.datasource.druid.stat-view-servlet.login-password=# 容许哪些ip拜访spring.datasource.druid.stat-view-servlet.allow=#禁止哪些ip拜访spring.datasource.druid.stat-view-servlet.deny=# Spring监控配置,阐明请参考Druid Github Wiki,配置_Druid和Spring关联监控配置spring.datasource.druid.aop-patterns= # Spring监控AOP切入点,如x.y.z.service.*,配置多个英文逗号分隔# 如果spring.datasource.druid.aop-patterns要代理的类没有定义interface请设置spring.aop.proxy-target-class=true

通过配置类配置

@Configurationpublic class MyConfig {    //配置 Druid 监控治理后盾的Servlet;//内置 Servlet 容器时没有web.xml文件,所以应用 Spring Boot 的注册 Servlet 形式    @Bean    public ServletRegistrationBean statViewServlet() {        ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");        // 这些参数能够在 com.alibaba.druid.support.http.StatViewServlet        // 的父类 com.alibaba.druid.support.http.ResourceServlet 中找到        Map<String, String> initParams = new HashMap<>();        initParams.put("loginUsername", "admin"); //后盾治理界面的登录账号        initParams.put("loginPassword", "123456"); //后盾治理界面的登录明码        //后盾容许谁能够拜访        //initParams.put("allow", "localhost"):示意只有本机能够拜访        //initParams.put("allow", ""):为空或者为null时,示意容许所有拜访        initParams.put("allow", "");        //deny:Druid 后盾回绝谁拜访        //initParams.put("deny", "192.168.1.20");示意禁止此ip拜访        //设置初始化参数        bean.setInitParameters(initParams);        return bean;    }    //配置 Druid 监控 之  web 监控的 filter//WebStatFilter:用于配置Web和Druid数据源之间的治理关联监控统计    @Bean    public FilterRegistrationBean webStatFilter() {        FilterRegistrationBean bean = new FilterRegistrationBean();        bean.setFilter(new WebStatFilter());        //exclusions:设置哪些申请进行过滤排除掉,从而不进行统计        Map<String, String> initParams = new HashMap<>();        initParams.put("exclusions", "*.js,*.css,/druid/*,/jdbc/*");        bean.setInitParameters(initParams);        //"/*" 示意过滤所有申请        bean.setUrlPatterns(Arrays.asList("/*"));        return bean;    }}

其实能够看到,两者的配置是一样的。

如何配置 Filter

你能够通过 spring.datasource.druid.filters=stat,wall,log4j ... 的形式来启用相应的内置Filter,不过这些Filter都是默认配置。如果默认配置不能满足你的需要,你能够放弃这种形式,通过配置文件来配置Filter,上面是例子。

# 配置StatFilter spring.datasource.druid.filter.stat.enabled=truespring.datasource.druid.filter.stat.db-type=h2spring.datasource.druid.filter.stat.log-slow-sql=truespring.datasource.druid.filter.stat.slow-sql-millis=2000# 配置WallFilter spring.datasource.druid.filter.wall.enabled=truespring.datasource.druid.filter.wall.db-type=h2spring.datasource.druid.filter.wall.config.delete-allow=falsespring.datasource.druid.filter.wall.config.drop-table-allow=false# 其余 Filter 配置不再演示

目前为以下 Filter 提供了配置反对,请参考文档或者依据IDE提醒(spring.datasource.druid.filter.*)进行配置。

  • StatFilter
  • WallFilter
  • ConfigFilter
  • EncodingConvertFilter
  • Slf4jLogFilter
  • Log4jFilter
  • Log4j2Filter
  • CommonsLogFilter

要想使自定义 Filter 配置失效须要将对应 Filter 的 enabled 设置为 true ,Druid Spring Boot Starter 默认禁用 StatFilter,你也能够将其 enabled 设置为 true 来启用它

参考

官网文档

参考