关于程序员:SpringBoot整合Druid

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
initialSize 0 初始化时建设物理连贯的个数。初始化产生在显示调用init办法,或者第一次getConnection时
maxActive 8 最大连接池数量
maxIdle 8 曾经不再应用,配置了也没成果
minIdle 最小连接池数量
maxWait 获取连贯时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用偏心锁,并发效率会有所降落,如果须要能够通过配置useUnfairLock属性为true应用非偏心锁。
poolPreparedStatements false 是否缓存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)办法
testOnBorrow true 申请连贯时执行validationQuery检测连贯是否无效,做了这个配置会升高性能。
testOnReturn false 偿还连贯时执行validationQuery检测连贯是否无效,做了这个配置会升高性能。
testWhileIdle false 倡议配置为true,不影响性能,并且保障安全性。申请连贯的时候检测,如果闲暇工夫大于timeBetweenEvictionRunsMillis,执行validationQuery检测连贯是否无效。
keepAlive false (1.0.28) 连接池中的minIdle数量以内的连贯,闲暇工夫超过minEvictableIdleTimeMillis,则会执行keepAlive操作。
timeBetweenEvictionRunsMillis 1分钟(1.0.14) 有两个含意: 1) Destroy线程会检测连贯的间隔时间,如果连贯闲暇工夫大于等于minEvictableIdleTimeMillis则敞开物理连贯。 2) testWhileIdle的判断根据,具体看testWhileIdle属性的阐明
numTestsPerEvictionRun 30分钟(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
  • 测试,打印出数据源
 @Test
public 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
  • 配置类

@Configuration
public 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默认值false
spring.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

通过配置类配置

@Configuration
public 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=true
spring.datasource.druid.filter.stat.db-type=h2
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.stat.slow-sql-millis=2000

# 配置WallFilter 
spring.datasource.druid.filter.wall.enabled=true
spring.datasource.druid.filter.wall.db-type=h2
spring.datasource.druid.filter.wall.config.delete-allow=false
spring.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 来启用它

参考

官网文档

参考

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理