SpringBoot配置Druid数据源

Posted 汪神

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot配置Druid数据源相关的知识,希望对你有一定的参考价值。

在我刚开始接触JDBC的时候,用的是DriveManager驱动来连接数据库的。而现在大多是用DataSource。

这里先简单说一下区别:

1、datasource是与连接池获取连接,而DriverManager是获取与数据库的连接!
DriverManager类的主要作用是管理注册到DriverManager中的JDBC驱动程序,并根据需要使用JDBC驱动程序建立与数据服务器的网络连接。但是建立与数据库的连接是一项较耗资源的工作,频繁的进行数据库连接建立操作会产生较大的系统开销,为了解决上述问题,可以采用数据库连接池技术。
2、datasource内部封装了 DriverManager的使用。。。
DataSource主要是为了方便配置使用。。。 作为OO概念上也需要有这个类和对象来表示数据的来源。。。
3、 jdk api解释
public interface DataSourceextends CommonDataSource, Wrapper
该工厂用于提供到此 DataSource 对象所表示的物理数据源的连接。作为 DriverManager 工具的替代项,DataSource 对象是获取连接的首选方法。实现 DataSource 接口的对象通常在基于 JavaTM Naming and Directory Interface (JNDI) API 的命名服务中注册。
DataSource 接口由驱动程序供应商实现。共有三种类型的实现:

1.基本实现 - 生成标准的 Connection 对象

2.连接池实现 - 生成自动参与连接池的 Connection 对象。此实现与中间层连接池管理器一起使用。

3.分布式事务实现 - 生成一个 Connection 对象,该对象可用于分布式事务,大多数情况下总是参与连接池。此实现与中间层事务管理器一起使用,大多数情况下总是与连接池管理器一起使用。


DataSource 对象的属性在必要时可以修改。例如,如果将数据源移动到另一个服务器,则可更改与服务器相关的属性。其优点在于,由于可以更改数据源的属性,所以任何访问该数据源的代码都无需更改。
通过 DataSource 对象访问的驱动程序本身不会向 DriverManager 注册。通过查找操作获取 DataSource 对象,然后使用该对象创建 Connection 对象。使用基本的实现,通过 DataSource 对象获取的连接与通过 DriverManager 设施获取的连接相同。

 

SpringBoot中默认使用的DataSource是org.apache.tomcat.jdbc.pool.DataSource数据源,配置的时候也很简单,引入springboot和jdbc有关的包之后只要简单的几行配置即可:

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/db_stupayment
spring.datasource.username=root
spring.datasource.password=4008

 

然后就是我们的Druid了:

DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池

 

 

现在就来讲讲在SpringBoot中怎么配置Druid

首先是在pom中加入相关的依赖:

<!--druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.19</version>
        </dependency>

 

 

然后是配置文件:

#Druid and datasourcee

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/db_stupayment
spring.datasource.username=root
spring.datasource.password=4008

#下面开始是和druid相关的配置

spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20

spring.datasource.maxWait=60000

spring.datasource.timeBetweenEvictionRunsMillis=60000

spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1 FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false

#false is the default,the mysql suggested to false,or it will cost a lot of storage
#suggested true in the orcale
#spring.datasource.poolPreparedStatements=true 
#spring.datasource.maxPoolPreparedStatementPerConnectionSize=20

spring.datasource.filters=stat,wall,log4j

spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

spring.datasource.useGlobalDataSourceStat=true



spring.datasource.loginUsername=admin
spring.datasource.loginPassword=400831
spring.datasource.resetEnable=false
spring.datasource.urlMappings=/druid/*
spring.datasource.urlPatterns=/*
spring.datasource.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*

#druid and datasource end

前面五行配置是spring检测的出的配置,相当于告诉spring一些关于数据库的信息,还有连接池的种类。

之后的配置spring都是检测不出的,但我们会在代码的配置文件中引用。

然后关于这些配置的含义,在下面的代码中有注解。

 

 

现在来看代码中的配置:(下面的代码都是在一个.java文件中的)

 

先完成field从配置文件中获取值并注入:

package com.stuPayment.config;

import java.sql.SQLException;

import javax.sql.DataSource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;

/**
 * 配置DruidDataSource
 * @author 85060
 *
 */
@Configuration
public class DruidConfig {

    private Logger logger = LoggerFactory.getLogger(DruidConfig.class);
    
    @Value("${spring.datasource.url}")   //数据库地址
    private String dbUrl;

    @Value("${spring.datasource.username}")   //数据库登录的账号名
    private String username;

    @Value("${spring.datasource.password}")   //数据库登录的密码
    private String password;

    @Value("${spring.datasource.driver-class-name}")   //数据库驱动名
    private String driverClassName;

    @Value("${spring.datasource.initialSize}")   //初始化连接数量 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
    private int initialSize;

    @Value("${spring.datasource.minIdle}")//最小连接数量
    private int minIdle;

    @Value("${spring.datasource.maxActive}")   //最大连接数量
    private int maxActive;

    @Value("${spring.datasource.maxWait}")  //获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
    private int maxWait;

    @Value("${spring.datasource.timeBetweenEvictionRunsMillis}")  //配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
    private int timeBetweenEvictionRunsMillis;

    @Value("${spring.datasource.minEvictableIdleTimeMillis}")   //配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
    private int minEvictableIdleTimeMillis;

    @Value("${spring.datasource.validationQuery}")   //用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。
    private String validationQuery;

    @Value("${spring.datasource.testWhileIdle}")   //建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
    private boolean testWhileIdle;

    @Value("${spring.datasource.testOnBorrow}")   //申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
    private boolean testOnBorrow;

    @Value("${spring.datasource.testOnReturn}")  //归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
    private boolean testOnReturn;

    @Value("${spring.datasource.filters}") //属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: 监控统计用的filter:stat日志用的filter:log4j防御sql注入的filter:wall
    private String filters;

    @Value("${spring.datasource.connectionProperties}")  //通过connectProperties属性来打开mergeSql功能;慢SQL记录
    private String connectionProperties;
    
    @Value("${spring.datasource.useGlobalDataSourceStat}")  //合并多个DruidDataSource的监控数据
    private boolean  useGlobalDataSourceStat;
    
    
    
    @Value("${spring.datasource.loginUsername}")  //在druid监测servlet中配置用的,用来登录监测网页界面的用户名
    private String loginUsername;
    
    @Value("${spring.datasource.loginPassword}")  //在druid监测servlet中配置用的,用来登录监测网页界面的密码
    private String loginPassword; 
    
    @Value("${spring.datasource.resetEnable}")  //在druid监测servlet中配置用的,禁用页面上的“Reset All”功能
    private String resetEnable;
    
    @Value("${spring.datasource.urlMappings}")  //在druid监测servlet中配置用的,设置用来访问监测界面的url
    private String urlMappings;
    
    @Value("${spring.datasource.urlPatterns}")  //在druid监测filter中配置用的,过滤规则
    private String urlPatterns;

    @Value("${spring.datasource.exclusions}")   //在druid监测servlet中配置用的,忽略资源
    private String exclusions;

 

 

 

 

然后是Druid作为DataSource的bean的配置:

/**
     * druid数据源的配置    
     * @return
     */
    @Primary // 默认数据源  如果有多个实例,优先注入
    @Bean(name = "dataSource", destroyMethod = "close")
    public DataSource druidDataSource() {
        
        DruidDataSource dataSource = new DruidDataSource();
        
        dataSource.setUrl(dbUrl);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setDriverClassName(driverClassName);
        
        //configuration
        dataSource.setInitialSize(initialSize);
        dataSource.setMinIdle(minIdle);
        dataSource.setMaxActive(maxActive);
        dataSource.setMaxWait(maxWait);
        dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
        dataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        dataSource.setValidationQuery(validationQuery);
        dataSource.setTestWhileIdle(testWhileIdle);
        dataSource.setTestOnBorrow(testOnBorrow);
        dataSource.setTestOnReturn(testOnReturn);
        
        try {
            
            
            dataSource.setFilters(filters);
            
            
        } catch (SQLException e) {
            // TODO Auto-generated catch block

            logger.error("druid configuration initialization filter", e);

            
        }
        
        dataSource.setConnectionProperties(connectionProperties);
        dataSource.setUseGlobalDataSourceStat(useGlobalDataSourceStat);
        
        return dataSource;


    }

 

 

然后是配置与注册druid监测系统的servlet(因为druid提供了个网页界面做监控界面所以要有个servlet)

/**
     * 配置druid监控系统的servlet
     * 这里就是注册了一个servlet相当于
     * @return
     */
    @Bean
    public ServletRegistrationBean druidServlet() {
        
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
        
        servletRegistrationBean.setServlet(new StatViewServlet());//Druid提供的servlet
        
        servletRegistrationBean.addUrlMappings(urlMappings);//设置用来访问监测界面的请求url
        
        //添加初始化参数:initParams
        /** 白名单,如果不配置或value为空,则允许所有 */
        //servletRegistrationBean.addInitParameter("allow","127.0.0.1,192.0.0.1");
        
        /** 黑名单,与白名单存在相同IP时,优先于白名单 */
        //servletRegistrationBean.addInitParameter("deny","192.0.0.1");
        
        /** 用户名 */
        servletRegistrationBean.addInitParameter("loginUsername",loginUsername);
        
        /** 密码 */
        servletRegistrationBean.addInitParameter("loginPassword",loginPassword);
        
        /** 禁用页面上的“Reset All”功能 */
        servletRegistrationBean.addInitParameter("resetEnable",resetEnable);

        return servletRegistrationBean;
        
    }

 

 

 

 然后是配置与注册druid监控系统的filter

/**
     * 配置Druid监控系统的filter
     * 这里就相当于注册了一个filter
     * @return
     */
    @Bean
    FilterRegistrationBean druidFilter() {
        
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        
        filterRegistrationBean.setFilter(new WebStatFilter());
        
        /** 过滤规则 */
        filterRegistrationBean.addUrlPatterns(urlPatterns);
        /** 忽略资源 */
        filterRegistrationBean.addInitParameter("exclusions", exclusions);
        
        return filterRegistrationBean;
        
    }

 

 

在SpringBoot中注册servlet和filter有两种方法,在我的博客“记录一下在SpringBoot中实现简单的登录认证”中有提到filter的两种方法。

 

最后运行工程,然后输入请求:

 

输入自己设置的登录账号和密码,成功进入监测界面monitor:

配置成功!!

 

 

 

 

 

参考过的博客:

讲DriverManager和DataSource的区别的:

  https://www.cnblogs.com/549294286/p/3559422.html

讲DruidDataSource一些配置参数的:

  https://www.cnblogs.com/wuyun-blog/p/5679073.html

讲SpringBoot中怎么配置Druid的:

  https://www.cnblogs.com/liuchuanfeng/p/7002046.html

  https://www.cnblogs.com/Jason-Xiang/p/7992370.html

 

以上是关于SpringBoot配置Druid数据源的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot系列之集成Druid配置数据源监控

SpringBoot + mybatis + druid 配置两个数据源

SpringBoot--配置Druid(德鲁伊)数据源监控

springboot配置Druid数据源

2510-Druid监控功能的深入使用与配置-基于SpringBoot-完全使用java config的形式

springboot 集成druid