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

原文地址:https://www.cnblogs.com/wangshen31/p/9425185.html

时间: 2024-11-05 22:06:40

SpringBoot配置Druid数据源的相关文章

SpringBoot配置 druid 数据源配置 慢SQL记录

spring: datasource: url: jdbc:mysql://127.0.0.12:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull username: root password: root druid: initialSize: 5 application: name: message-center secur

Spring Boot 配置Druid数据源

Spring Boot 配置Druid数据源 Druid是阿里巴巴的一个开源项目,使用这个数据源的好处就是可以使用监控功能,提供了一个简单的后台,可以监控数据源的数据 配置方式 导入坐标 <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</art

Springboot整合Druid数据源

Druid是阿里巴巴的一个开源的JDBC组件,该组件由数据库连接池.插件框架和SQL解析器组成,主要功能如下: 1.DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系. 2.DruidDataSource 高效可管理的数据库连接池. 3.SQLParser解析器兼容所有的JDBC数据库,如:Mysql,Oracle.SQL Server数据库. 同时它结合了C3P0.DBCP.PROXOOL等DB池的优点,加入了日志监控,在稳定性.可扩展性和性能方便具有

Jfinal开发代码碎片_导出报表_配置druid数据源_使用guava

1.使用jfinal扩展包jfinal-ext-3.1.2.jar导出Excel报表,他需要依赖poi-3.12.jar jai包下载地址:http://files.cnblogs.com/files/zhougaojun/jfinal-ext_poi.zip 导出Excel方法: //导出Excel public void excel()throws Exception{ List<Record> list = Db.find("select * from activeaction

springboot集成druid数据源并且监控

Druid是Java语言中最好的数据库连接池,并且能够提供强大的监控和扩展功能. 业界把 Druid 和 HikariCP 做对比后,虽说 HikariCP 的性能比 Druid 高,但是因为 Druid 包括很多维度的统计和分析功能,所以这也是大家都选择使用它的原因. 首先配置 druid maven 依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactI

springboot配置多数据源

在做项目的过程中难免会遇到这种情况:一个项目需要两个数据库中的数据,希望这篇文章能给遇到这些问题的小伙伴一点帮助 第一步:将两个数据源的mapper接口和xml文件分别放入不同的文件夹下: 第二步:在application.yml文件中加入双数据源,一定要指定主数据源,不然会报错 spring:   datasource:     primary:       driver-class-name: com.mysql.jdbc.Driver       url: url地址       user

SpringBoot整合Druid数据源详细文档

1.数据库结构 2.项目结构 3.pom.xml文件 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupI

【Mysql】SpringBoot阿里Druid数据源连接池配置

一.pom.xml添加 <!-- 配置数据库连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.0</version> </dependency> 二.application.properties 添加 # 连接池配置spring.datasource.type

springboot配置多数据源(JdbcTemplate方式)

在实际开发中可能会遇到需要配置多个数据源的情况,比如:需要使用多个host.需要使用多种数据库(MySql.Oracle.SqlServer...) 如果使用springboot开发,可做如下配置: Config: import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; imp