zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    02-scrapy安装及目录结构
    drf结合sql server搭建后台管理系统
    drf连接sqlserver数据库
    drf xadmin
    drf goods设计
    drf user models设计
    什么是全文检索
    周进度总结
    程序员修炼之道阅读笔记(四)
    周进度总结
  • 原文地址:https://www.cnblogs.com/wangshen31/p/9425185.html
Copyright © 2011-2022 走看看