文档章节

知识点③:Spring Boot 中的 druid 配置及使用

s6
 s6
发布于 03/13 15:35
字数 1703
阅读 365
收藏 13
点赞 0
评论 2

Spring Boot druid 配置

依赖

  1. 在 Spring Boot 项目中加入 druid 依赖
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>druid</artifactId>
	<version>${druid.version}</version>
</dependency>

配置

spring.datasource.url= 
spring.datasource.username=
spring.datasource.password=
# ...其他配置(可选,不是必须的,使用内嵌数据库的话上述三项也可省略不填)

数据源配置参数详解

参考 → DRUID连接池的使用

  • #druid-jdbc 配置
#数据库连接:这里是 mysql
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/group-pool?useUnicode=true&characterEncoding=UTF-8&useSSL=false
#数据库用户名
spring.datasource.username=root
#数据库密码
spring.datasource.password=sansicn
#数据库驱动类
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  • #druid-cp 配置
#数据源名称,当多数据源时,可通过该名称来区分
#默认生成名称为:"DataSource-" + System.identityHashCode(this)
spring.datasource.name=
#数据源类型
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
spring.datasource.initialSize=10
#最小连接池数量
spring.datasource.minIdle=10
#最大连接池数量
spring.datasource.maxActive=200
#获取连接时最大等待时间,单位毫秒。
#配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
spring.datasource.maxWait=60000
#有两个含义: 
#1) Destroy线程会检测连接的间隔时间
#2)testWhileIdle的判断依据,详细看testWhileIdle属性的说明
spring.datasource.timeBetweenEvictionRunsMillis=60000
#一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.minEvictableIdleTimeMillis=300000
#验证连接有效与否的SQL,不同的数据库配置不同
spring.datasource.validationQuery=SELECT 1 FROM DUAL
#建议配置为true,不影响性能,并且保证安全性
#申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
spring.datasource.testWhileIdle=true
#申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
spring.datasource.testOnBorrow=false
#归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
spring.datasource.testOnReturn=false
#是否缓存preparedStatement,也就是PSCache
#PSCache对支持游标的数据库性能提升巨大,比如说oracle
#在mysql下建议关闭???
spring.datasource.poolPreparedStatements=true
#每个连接上PSCache的大小
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.filters=stat,wall,log4j

数据源配置类

package com.shuchuanggroup.group_pool.config;

import com.alibaba.druid.filter.Filter;
import com.alibaba.druid.filter.stat.StatFilter;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.wall.WallConfig;
import com.alibaba.druid.wall.WallFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
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 javax.sql.DataSource;
import java.util.ArrayList;
import java.util.List;

/**
 * DRUID数据源配置
 */
@Configuration
public class DruidConfig {

    @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}")
    private Integer initialSize;
    @Value("${spring.datasource.minIdle}")
    private Integer minIdle;
    @Value("${spring.datasource.maxActive}")
    private Integer maxActive;
    @Value("${spring.datasource.maxWait}")
    private Integer maxWait;
    @Value("${spring.datasource.timeBetweenEvictionRunsMillis}")
    private Integer timeBetweenEvictionRunsMillis;
    @Value("${spring.datasource.minEvictableIdleTimeMillis}")
    private Integer minEvictableIdleTimeMillis;
    @Value("${spring.datasource.validationQuery}")
    private String validationQuery;
    @Value("${spring.datasource.testWhileIdle}")
    private Boolean testWhileIdle;
    @Value("${spring.datasource.testOnBorrow}")
    private Boolean testOnBorrow;
    @Value("${spring.datasource.testOnReturn}")
    private Boolean testOnReturn;
    @Value("${spring.datasource.poolPreparedStatements}")
    private Boolean poolPreparedStatements;
    @Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")
    private Integer maxPoolPreparedStatementPerConnectionSize;
    @Value("${spring.datasource.filters}")
    private String filters;
    @Value("{spring.datasource.connectionProperties}")
    private String connectionProperties;

    @Bean
    @Primary
    public DataSource dataSource(){
        DruidDataSource datasource = new DruidDataSource();

        datasource.setUrl(this.dbUrl);
        datasource.setUsername(username);
        datasource.setPassword(password);
        datasource.setDriverClassName(driverClassName);
        //configuration
        if(initialSize != null) {
            datasource.setInitialSize(initialSize);
        }
        if(minIdle != null) {
            datasource.setMinIdle(minIdle);
        }
        if(maxActive != null) {
            datasource.setMaxActive(maxActive);
        }
        if(maxWait != null) {
            datasource.setMaxWait(maxWait);
        }
        if(timeBetweenEvictionRunsMillis != null) {
            datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
        }
        if(minEvictableIdleTimeMillis != null) {
            datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        }
        if(validationQuery!=null) {
            datasource.setValidationQuery(validationQuery);
        }
        if(testWhileIdle != null) {
            datasource.setTestWhileIdle(testWhileIdle);
        }
        if(testOnBorrow != null) {
            datasource.setTestOnBorrow(testOnBorrow);
        }
        if(testOnReturn != null) {
            datasource.setTestOnReturn(testOnReturn);
        }
        if(poolPreparedStatements != null) {
            datasource.setPoolPreparedStatements(poolPreparedStatements);
        }
        if(maxPoolPreparedStatementPerConnectionSize != null) {
            datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
        }

        if(connectionProperties != null) {
            datasource.setConnectionProperties(connectionProperties);
        }

        List<Filter> filters = new ArrayList<>();
        filters.add(statFilter());
        filters.add(wallFilter());
        datasource.setProxyFilters(filters);

        return datasource;
    }

    @Bean
    public ServletRegistrationBean druidServlet() {
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
        servletRegistrationBean.setServlet(new StatViewServlet());
        servletRegistrationBean.addUrlMappings("/druid/*");
        return servletRegistrationBean;
    }

    @Bean
    public StatFilter statFilter(){
        StatFilter statFilter = new StatFilter();
        statFilter.setLogSlowSql(true);
        statFilter.setMergeSql(true);
        statFilter.setSlowSqlMillis(1000);

        return statFilter;
    }

    @Bean
    public WallFilter wallFilter(){
        WallFilter wallFilter = new WallFilter();

        //允许执行多条SQL
        WallConfig config = new WallConfig();
        config.setMultiStatementAllow(true);
        wallFilter.setConfig(config);

        return wallFilter;
    }

}

浏览器监控配置

  • 监控支持
#配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.filters=stat,wall,log4j
  • StatViewServlet servlet配置
import com.alibaba.druid.support.http.StatViewServlet;

import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;

@WebServlet(urlPatterns="/druid/*",initParams={
        // @WebInitParam(name="allow",value="192.168.1.72,127.0.0.1"),// IP白名单
        // @WebInitParam(name="deny",value="192.168.1.73"),// IP黑名单
        @WebInitParam(name="loginUsername",value="admin"),// 用户名
        @WebInitParam(name="loginPassword",value="123456"),// 密码
        @WebInitParam(name="resetEnable",value="false")//是否显示重置统计数据按钮
    }
)
public class DruidStatViewServlet extends StatViewServlet {
    private static final long serialVersionUID = 1L;
}
  • WebStatFilter 静态资源过滤器
import com.alibaba.druid.support.http.WebStatFilter;

import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;

@WebFilter(filterName="druidWebStatFilter",
    urlPatterns="/*",
    initParams={
        @WebInitParam(name="exclusions",value="*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")//忽略资源
    }
)
public class DruidStatFilter extends WebStatFilter {}

多数据源配置:mybatis

参考 http://www.mybatis.org/spring/index.html 1.spring boot 默认启用了 单数据源的自动配置,所以第一步我们需要关闭数据源的自动配置功能:

//只需要在spring boot app注解增加排除参数,排除掉数据源的自动配置配置功能即可
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class OnlyswordApplication {
	public static void main(String[] args) {
		SpringApplication.run(OnlyswordApplication.class, args);
	}
}

2.分别配置数据源配置,并指定数据源名称:

  • properties文件
#db1
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/only_sword?useUnicode=true&characterEncoding=UTF-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root

#db2
spring.datasource.db2.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.db2.url=jdbc:mysql://127.0.0.1:3306/only_sword?useUnicode=true&characterEncoding=UTF-8&useSSL=false
spring.datasource.db2.username=root
spring.datasource.db2.password=root
  • datasource 配置
  1. ds1配置
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;

@Configuration
public class Datasource1Config {

    @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;

    //生成数据源1
    @Bean(name = "ds1")
    @Primary
    public DataSource dataSource(){
        DruidDataSource datasource = new DruidDataSource();
        datasource.setUrl(this.dbUrl);
        datasource.setUsername(username);
        datasource.setPassword(password);
        datasource.setDriverClassName(driverClassName);
        return datasource;
    }
}

  1. ds2配置
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;

@Configuration
public class Datasource2Config {

    @Value("${spring.datasource.db2.url}")
    private String dbUrl;
    @Value("${spring.datasource.db2.username}")
    private String username;
    @Value("${spring.datasource.db2.password}")
    private String password;
    @Value("${spring.datasource.db2.driver-class-name}")
    private String driverClassName;

    //生成数据源2
    @Bean(name = "ds2")
    @Primary
    public DataSource dataSource(){
        DruidDataSource datasource = new DruidDataSource();
        datasource.setUrl(this.dbUrl);
        datasource.setUsername(username);
        datasource.setPassword(password);
        datasource.setDriverClassName(driverClassName);
        return datasource;
    }
}

  • mybatis 配置
  1. properties 配置
# mybatis_plus_config
mybatis-plus.m1.mapper-locations=classpath*:mapper1/*Mapper.xml
mybatis-plus.m1.typeAliasesPackage=com.sword.onlysword.entity


mybatis-plus.m2.mapper-locations=classpath*:mapper2/*Mapper.xml
mybatis-plus.m2.typeAliasesPackage=com.sword.onlysword.entity
  1. 引用 ds1 并扫描映射器,将它们链接到指定的SqlSessionTemplate并将它们注册到Spring上下文,以便将它们注入到bean中。
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.sword.onlysword.mapper1*", sqlSessionTemplateRef = "template1")
public class MybatisConfig {

    @Value("${mybatis-plus.m1.mapper-locations}")
    private String mapperLocations;
    @Value("${mybatis-plus.m1.typeAliasesPackage}")
    private String aliasesPackage;

    @Autowired
    @Qualifier("db1")
    private DataSource db1;

    @Bean
    public SqlSessionTemplate template1() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(db1);
        //配置实体映射
        factoryBean.setTypeAliasesPackage(aliasesPackage);
        //配置 mapper.xml 所在包
        factoryBean.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources(mapperLocations));
        return new SqlSessionTemplate(factoryBean.getObject());
    }

}

  1. 引用 ds2 并扫描映射器,将它们链接到指定的SqlSessionTemplate并将它们注册到Spring上下文,以便将它们注入到bean中。
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.sword.onlysword.mapper2*", sqlSessionTemplateRef = "template2")
public class MybatisConfig {

    @Value("${mybatis-plus.m2.mapper-locations}")
    private String mapperLocations;
    @Value("${mybatis-plus.m2.typeAliasesPackage}")
    private String aliasesPackage;

    @Autowired
    @Qualifier("db2")
    private DataSource db2;

    @Bean
    public SqlSessionTemplate template2() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(db2);
        factoryBean.setTypeAliasesPackage(aliasesPackage);
        factoryBean.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources(mapperLocations));
        return new SqlSessionTemplate(factoryBean.getObject());
    }

}

这样只需要调用对应的 mapper 接口就能操作不同的数据源了,不同的 sqlsessiontemple 所对应的 mapper.xml 分别来自不同的文件夹,降低复杂度,方便维护,增强可读性

多数据源动态配置

待续

Druid Spring Boot Starter

  • 更简洁、更简单的druid配置

Git 地址 → Druid Spring Boot Starter

Druid

  • 源码地址

Git 地址 → Druid

© 著作权归作者所有

共有 人打赏支持
s6

s6

粉丝 1
博文 9
码字总数 4233
作品 0
成都
高级程序员
加载中

评论(2)

s6
s6

引用来自“loyal”的评论

如果是新项目,不应该这么用了.应该直接用spring-boot-start-druid
确实是这样,这是照顾初学者,而且可以了解相关配置的使用方式和实现原理,我文章末尾也附带了:Druid Spring Boot Starter 官方连接,里面有详细流程,因为比较简单,所以就没有单独提出来进行说明:smile:,不能因为有框架就知其然而不知其所以然
loyal
loyal
如果是新项目,不应该这么用了.应该直接用spring-boot-start-druid
spring boot 1.5.4 入门和原理(二)

1 spring boot入门 1.1 环境准备 JDK 7及以上 eclipse开发工具 项目管理工具Maven 本文采用、RELEASE(或1.5.2.RELEASE)调试通过。 spring-boot相关项目源码, 码云地址:https://git.oschi...

wyait ⋅ 2017/09/18 ⋅ 0

dynamic-datasource-spring-boot-starter V1.1.0 发布

SpringBoot2.x默认使用HikariCP,但在国内Druid的使用者非常庞大,此项目特地对其进行了适配,完成多数据源下使用Druid进行监控。 项目引入druid-spring-boot-starter依赖。 com.alibaba dr...

小锅盖 ⋅ 05/05 ⋅ 0

SpringBoot详解(二)-Spring Boot的核心

SpringBoot详解系列文章: SpringBoot详解(一)-快速入门 SpringBoot详解(二)-Spring Boot的核心 SpringBoot详解(三)-Spring Boot的web开发 SpringBoot详解(四)-优雅地处理日志 Spri...

CSDN_LQR ⋅ 2017/08/30 ⋅ 0

SpringBoot自定义starter

SpringBoot 提供了众多的starter简化我们开发,为了更好地使用这些starter,了解其原理是很重要的,今天就来自定义一个starter。 1,如何自定义 ①,我们首先要有一个意识,springboot自己适...

暗中观察 ⋅ 05/21 ⋅ 0

基于Maven的Springboot+Mybatis+Druid+Swagger2+mybatis-generator框架环境搭建

前言 最近做回后台开发,重新抓起以前学过的SSM(Spring+Spring MVC+Mybatis),但是发现配置实在过于复杂,好多东西配置起来麻烦,虽然最终是配置出来了,但是还是感觉开发速度跟不上,本来打...

易达 ⋅ 2016/10/15 ⋅ 0

微服务选择Spring Cloud还是Dubbo?

点击关注 异步图书,置顶公众号 每天与你分享 IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 在阿里巴巴的生态中,微服务逐渐成为主要的服务形态,伴随着容器...

异步社区 ⋅ 04/27 ⋅ 0

微服务架构 spring boot 那些最基础的知识点

一、创建SpringBoot项目 概念 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再...

烂猪皮 ⋅ 05/09 ⋅ 0

Spring Boot干货系列:(十一)数据存储篇-Spring Boot整合Mybatis通用Mapper插件

前言 上次介绍了Spring Boot中Mybatis的简单整合,本篇深入来结合通用Mapper、Mybatis Geneator以及分页PageHelper来打造适合企业开发的模板框架。 正文 项目框架还是跟上一篇一样使用Sprin...

嘟爷MD ⋅ 2017/12/20 ⋅ 0

Spring Boot 2.0 动态数据源快速启动器 1.3.0 发布

dynamic-datasource-spring-boot-starter 升级到1.3.0版本,dynamic-datasource-spring-boot-starter 是 Spring Boot 2.0 的动态数据源快速启动器。 项目及文档地址:https://gitee.com/bao......

小锅盖 ⋅ 05/08 ⋅ 0

SpringBoot 自动开启事务原理

1,TransactionAutoConfiguration ①,这是SpringBoot 的事务注解自动配置类,位于spring-boot-autoconfigure jar下。 ②,@ConditionalOnClass(PlatformTransactionManager.class) 通过这一......

暗中观察 ⋅ 05/27 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

vim基础-编辑模式-命令模式

编辑模式:可以编辑修改文件。编辑模式下 按“esc”键返回一般模式。 按一次“Insert”键 (一般在键盘回格键右边)作用和“i”一样表示“插入”。按两次“Insert”键表示“替换”,作用为:...

ZHENG-JY ⋅ 17分钟前 ⋅ 0

MaxCompute读取分析OSS非结构化数据的实践经验总结

摘要: 本文背景 很多行业的信息系统中,例如金融行业的信息系统,相当多的数据交互工作是通过传统的文本文件进行交互的。此外,很多系统的业务日志和系统日志由于各种原因并没有进入ELK之类...

阿里云云栖社区 ⋅ 22分钟前 ⋅ 0

Linux操作系统有何优势?Linux学习

  当今世界流行的操作系统有3大类,Linux、Mac OS和Windows操作系统,Linux操作系统因其开源、免费、跨平台、良好的界面等特性,深受广大程序员们的青睐!   Linux操作系统被广泛的应用于...

老男孩Linux培训 ⋅ 24分钟前 ⋅ 0

Spring Cloud Spring Boot mybatis分布式微服务云架构 开发Web应用

静态资源访问 在我们开发Web应用的时候,需要引用大量的js、css、图片等静态资源。 默认配置 Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则: /static /pub...

itcloud ⋅ 28分钟前 ⋅ 0

6月19日任务 设置更改root密码、连接mysql、mysql常用命令

13.1 设置更改root密码 1. /usr/local/mysql/bin/mysql -uroot 设置环境变量 : export PATH=$PATH:/usr/local/mysql/bin/ 永久生效: vim /etc/profile 加入 export PATH=$PATH:/usr/local/m......

吕湘颖 ⋅ 29分钟前 ⋅ 0

MaxCompute读取分析OSS非结构化数据的实践经验总结

摘要: 本文背景 很多行业的信息系统中,例如金融行业的信息系统,相当多的数据交互工作是通过传统的文本文件进行交互的。此外,很多系统的业务日志和系统日志由于各种原因并没有进入ELK之类...

猫耳m ⋅ 30分钟前 ⋅ 0

Spring MVC controller,return重定向redirect:

@RequestMapping(value="/save",method=RequestMethod.POST)public String doSave(Course course) {log.debug("Info of Course");log.debug(ReflectionToStringBuilder.toStr......

颖伙虫 ⋅ 38分钟前 ⋅ 0

JavaSE——线程介绍

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 线程: 介绍:管线程叫多任务处理,首先你得知道...

凯哥学堂 ⋅ 42分钟前 ⋅ 0

ORM——使用spring jpa data实现逻辑删除

前言 在业务中是忌讳物理删除数据的,数据的这个对于一个IT公司可以说是最核心的资产,如果删除直接就物理删除,无疑是对核心资产的不重视,可能扯的比较远,本文最主要是想通过spring jpa ...

alexzhu592 ⋅ 48分钟前 ⋅ 0

CDN caching

Incapsula应用感知CDN使用智能分析和频率分析来动态缓存内容,并最大限度地提高效率。确保可直接从RAM获取最常访问的资源,而不依赖于较慢的访问机制。 1、 静态内容缓存 Incapsula缓存静态内...

上树的熊 ⋅ 51分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部