SpringBoot如何整合Druid

简介

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

Druid 是阿里巴巴开源平台上一个数据库连接池实现,结合了 C3P0、DBCP 等 DB 池的优点,同时加入了日志监控。

Druid 可以很好的监控数据库池连接和 SQL 的执行情况,天生就是针对监控而生的 数据库连接池。

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

com.alibaba.druid.pool.DruidDataSource基本配置参数为:

配置默认值说明
name配置这个属性的意义在于:如果存在多个数据源,监控的时候可以通过名字来区分。如果没有配置,将会生成一个名字,格式是:“DataSource-”+System.identutyHashCode(this)。
url连接数据库的url,不同的数据库不一样。例如:mysql数据库:jdbc:mysql://10.20.153.104:3306/druid2;oracle数据库:jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
username连接数据库的用户名
password连接数据库的密码。如果不希望密码直接写在配置文件中,可以使用ConfigFilter。具体参见:https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter
这一项可配可不配,如果不配置druid会根据url自动识别数据库类型,然后选择对应的driverClassName
initialSize0初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
maxActive8最大连接池数量
maxIdle8不使用了,配置了也没用
miniIdle最小连接池数量
maxwait获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
poolPreparedStatementsfalse是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql中建议关闭。
maxOpenPreparedStatements-1要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动出发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以吧这个数值配置大一些。比如说100
validationQuery用来检测连接是否为有效sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用
validationQueryTimeout单位:秒,检测连接是否有效的超时时间。底层调用jdbcStatement对象的void setQueryTimeout(intseconds)方法
申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testOnReturnfalse归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testWhileIdlefalse建议配置为true,不影响性能,并且保证安全性。申请连接时检测,如果空闲时间大于timeBetweenEcictionRunsMills,执行validationQuery检测连接是否有效
timeBetweenEvictionRunsMillis1分钟(1.0.14)有两个含义:(1)Destory线程会检测连接的间隔时间,如果连接空闲时间大于等于minEVictableIdleTimeMillis则关闭物理连接(2)testWhileldle的判断依据,详细看testWhileldle属性说明
numTestPerEvictionRun不在使用,一个DruidDataSource只支持一个EvictionRun
minEvictableldleTimeMillis30分钟(1.0.14)连接保持空闲而不被驱逐的最长时间
connectioninitSqls物理连接初始化的时候执行的sql
exceptionSorter根据数据库类型自动识别当数据库抛出一些不可恢复的异常时,抛弃连接
filters属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:监控统计用的filter:stat日志用的filter:log4j 防御sql’注入的filter:wall
proxyFilters类型是List<com.alibaba.druid.filter.Filter>,如果同时配置了filters和proxyFliters,是组合关系而非替换关系。



配置数据源

1、添加Druid数据源依赖

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

2、使用spring.datasource.type指定数据源为Druid

spring:
  datasource:
    username: root
    password: '111'
    url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource

3、切换数据源之后,在测试类中注入DataSource,然后获取,在控制台输出(测试类的代码见第6步)

@Configuration
public class DruidConfig {
	//给数据源绑定属性并加入容器中
    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DruidDataSource druidDataSource(){
        return new DruidDataSource();
    }
}

在这里插入图片描述

4、测试转换成功后就能够设置数据源的一些初始化参数,具体有哪些参数可以配置可以查看源码。

spring:
   datasource:
     username: root
     password: '111'
     url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
     driver-class-name: com.mysql.cj.jdbc.Driver
     type: com.alibaba.druid.pool.DruidDataSource
 #Spring Boot 默认是不注入这些属性值的,需要自己绑定
     #druid 数据源专有配置
     initialSize: 5
     minIdle: 5
     maxActive: 20
     maxWait: 60000
     timeBetweenEvictionRunsMillis: 60000
     minEvictableIdleTimeMillis: 300000
     validationQuery: SELECT 1 FROM DUAL
     testWhileIdle: true
     testOnBorrow: false
     testOnReturn: false
     poolPreparedStatements: true
 
     #配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
     #如果报错  java.lang.ClassNotFoundException: org.apache.log4j.Priority
     #则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j
     filters: stat,wall,log4j
     maxPoolPreparedStatementPerConnectionSize: 20
     useGlobalDataSourceStat: true
     connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

5、导入log4j的依赖

<dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>

6、去测试类中测试是否成功配置

@SpringBootTest
    class DataApplicationTests {
    
        @Autowired
        DataSource dataSource;
    
        @Test
        void contextLoads() throws SQLException {
            //class com.zaxxer.hikari.HikariDataSource
            System.out.println(dataSource.getClass());
    
            //HikariProxyConnection@13001549 wrapping com.mysql.cj.jdbc.ConnectionImpl@65f58c6e
            //获取连接
            Connection connection = dataSource.getConnection();
            System.out.println(connection);
    
            DruidDataSource druidDataSource = (DruidDataSource) dataSource;// maxActive: 20
            //maxWait: 60000
            System.out.println("最大连接数:" + druidDataSource.getMaxActive());
            System.out.println("最长等待时间:" + druidDataSource.getMaxWait());
    
            //关闭连接
            connection.close();
        }
    
    }

查看输出,配置成功!



配置Druid数据源监控

设置后台管理页,登录账号、密码等

@Bean
//配置 Druid 监控管理后台的Servlet;
//内置 Servlet 容器时没有web.xml文件,所以使用 Spring Boot 的注册 Servlet 方式
public ServletRegistrationBean statViewServlet(){
    ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");

    Map<String,String> initParameters = new HashMap<>();
    // 这些参数可以在 com.alibaba.druid.support.http.StatViewServlet
    // 的父类 com.alibaba.druid.support.http.ResourceServlet 中找到
    initParameters.put("loginUsername","chunni");//后台管理界面的登录账号
    initParameters.put("loginPassword","123");//后台管理界面的登录密码
    //后台允许谁可以访问
    //initParams.put("allow", "localhost"):表示只有本机可以访问
    //initParams.put("allow", ""):为空或者为null时,表示允许所有访问
    initParameters.put("allow", "");
    //deny:Druid 后台拒绝谁访问
    //initParams.put("chunni", "192.168.1.104");表示禁止此ip访问

    bean.setInitParameters(initParameters);

    return bean;
}

根据设置的路径访问,例如:http://localhost:8080/druid/

登录进去之后就可以查看监控的信息了



配置Druid web 监控 filter 过滤器

//配置 Druid 监控 之  web 监控的 filter
//WebStatFilter:用于配置Web和Druid数据源之间的管理关联监控统计
@Bean
public FilterRegistrationBean webStatFilter() {
    FilterRegistrationBean bean = new FilterRegistrationBean(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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值