【2.0】SpringBoot2配置Druid数据源及监控

时间:2023-03-09 14:56:46
【2.0】SpringBoot2配置Druid数据源及监控

什么是Druid?

Druid首先是Java语言中最好的数据库连接池,也是阿里巴巴的开源项目。Druid是阿里巴巴开发的号称为监控而生的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource等等等,秒杀一切。而且Druid已经在阿里巴巴部署了超过600个应用,经过好几年年生产环境大规模部署的严苛考验!

filters: stat,wall,log4j

stat:Druid内置提供一个StatFilter,用于统计监控信息。如果需要配置访问页面可以参考,https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE,我还没有研究这个,有研究的麻烦留意告诉一下,以后会找机会更新上来,毕竟很好用。
wall:Druid防御SQL注入攻击的WallFilter就是通过Druid的SQL Parser分析。Druid提供的SQL Parser可以在JDBC层拦截SQL做相应处理,比如说分库分表、审计等。
log4j:这个就是日志记录的功能,可以把sql语句打印到log4j供排查问题。

方式一、引入第三方druid包

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version></version>
</dependency>

但这种在配置时需要手动配置DruidDataSource和监控,因在此过程中遇到ClassNotFound:DruidDataSource(jar正确被引用的情况下)以及其他的错误,所以没有使用这种方式

/**
     * @Title: 数据源配置
     * @Description: TODO
     * @return DataSource
     * @author Sunny
     * @date 2018年10月31日 下午2:57:45
     * @throws
     */
    @Bean(name = "dataSource")
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource druid(){
//        DruidDataSource dataSource = new DruidDataSource();
//        dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
//        dataSource.setUrl(env.getProperty("spring.datasource.url"));
//        dataSource.setUsername(env.getProperty("spring.datasource.username"));
//        dataSource.setPassword(env.getProperty("spring.datasource.password"));
//        dataSource.setInitialSize(Integer.valueOf(env.getProperty("spring.datasource.initial-size")));
//        dataSource.setMinIdle(Integer.valueOf(env.getProperty("spring.datasource.min-idle")));
//        dataSource.setMaxActive(Integer.valueOf(env.getProperty("spring.datasource.max-active")));
//        dataSource.setMaxWait(Integer.valueOf(env.getProperty("spring.datasource.max-wait")));
//        return dataSource;
        return new DruidDataSource();
    }

方式二、引入druid-spring-boot-starter包

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version></version>
</dependency>

application.yml配置

# 项目配置
spring:
    application:
        name: provider-user
    datasource:
        username: root
        password:
        driver-class-name: com.mysql.cj.jdbc.Driver  # mysql8.0以前使用com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/enterprise?useUnicode=true&amp;useSSL=false&amp;characterEncoding=UTF-8&amp;serverTimezone=GMT%2B8
        #type: com.alibaba.druid.pool.DruidDataSource  # 使用Druid数据源
        druid:
            initial-size: 5  # 初始化大小
            min-idle: 5  # 最小
            max-active: 100  # 最大
            max-wait: 60000  # 连接超时时间
            time-between-eviction-runs-millis: 60000  # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
            min-evictable-idle-time-millis: 300000  # 指定一个空闲连接最少空闲多久后可被清除,单位是毫秒
            validationQuery: select 'x'
            test-while-idle: true  # 当连接空闲时,是否执行连接测试
            test-on-borrow: false  # 当从连接池借用连接时,是否测试该连接
            test-on-return: false  # 在连接归还到连接池时是否测试该连接
            filters: config,wall,stat  # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
            poolPreparedStatements: true
            maxPoolPreparedStatementPerConnectionSize: 20
            maxOpenPreparedStatements: 20
            connectionProperties: druid.stat.slowSqlMillis=200;druid.stat.logSlowSql=true;config.decrypt=true
            web-stat-filter:
                enabled: true
                url-pattern: /*
                exclusions: /druid/*,*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico
                session-stat-enable: true
                session-stat-max-count: 10
            stat-view-servlet:
                enabled: true
                url-pattern: /druid/*
                reset-enable: true
                login-username: admin
                login-password: admin

注意:spring-boot2中不要使用配置中注掉的type属性,会报错String不能转换为DataSource的错误

监测页面:http://localhost:端口/druid/index.html