SpringBoot-Mysql模板多数据源加载

qq交流群: 812321371

微信交流群: MercyYao

简介

在 java 项目里常用到 mysql 多数据源操作。结合 springboot 使用原有的还是很方便的。

不过需要配置多套数据源的配置。

在微服务里, 数据库连接之类的配置是单独拆开读取。相当于一个模板。

如下mysql:

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/${config.mysql.name}?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&autoReconnect=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driverClassName=com.mysql.jdbc.Driver

redis rabbitmq mongodb 等等中间件连接配置通过单独配置分开,以便后续方便修改ip等连接信息。

当然 springboot 在注入多数据源时要读取相应前缀的数据配置。

代码:

@Bean
@ConfigurationProperties(prefix = "spring.datasource.onemysql")
public DataSource originalDataSource(DataSourceFactory dataSourceFactory) {
return DataSourceBuilder.create().build();
}

配置:

spring.datasource.onemysql.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.onemysql.url=jdbc:mysql://127.0.0.1:3306/${config.mysql.name}?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&autoReconnect=true
spring.datasource.onemysql.username=root
spring.datasource.onemysql.password=root
spring.datasource.onemysql.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.onemysql.driverClassName=com.mysql.jdbc.Driver

上面方式加载以 onemysql 开始的数据源配置。如果是多个的话,相应配置多个bean和配置文件。

根据上述方式, 我们可以使用一个mysql模板, 通过一定方式去加载创建对应的数据源。微服务下只需要维护一个mysql配置模板。

功能使用

添加依赖

ps: 实际version版本请使用最新版

最新版本:

点击查看最新新版本

<dependency>
<groupId>com.purgeteam</groupId>
<artifactId>mysql-datasource-spring-boot-starter</artifactId>
<version>0.1.0.RELEASE</version>
</dependency>

1 配置模板

我们先按照原有的方式配置mysql数据源配置。

config.mysql.name=user
config.mysql.hosturl=127.0.0.1:3306 # mysql
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://${config.mysql.hosturl}/${config.mysql.name}?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&autoReconnect=true
spring.datasource.jdbc-url=${spring.datasource.url}
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.filters=stat
spring.datasource.maxActive=20
spring.datasource.initialSize=1
spring.datasource.maxWait=60000
spring.datasource.minIdle=1
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=select 'x'
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
spring.datasource.poolPreparedStatements=true
spring.datasource.maxOpenPreparedStatements=20

config.mysql.name 为数据库名称, 为下面代码注入做准备。

2 数据库名结合模板配置

通过 DataSourceFactory#createDataSource 方法可以将指定数据库注入。模板配置为之前的配置, 数据库名称通过 ${config.mysql.name} 进行替换。

/**
* 数据库名称替换方式生成 {@link DataSource}
* @author purgeyao
* @since 1.0
*/
@Configuration
public class OneDataSourceConfiguration { ... /**
* DataSourceFactory#createDataSource 方式加载 one_mysql 数据库
* @param dataSourceFactory dataSourceFactory
* @return {@link DataSource}
*/
@Primary
@Bean
public DataSource oneDataSource(DataSourceFactory dataSourceFactory) {
return dataSourceFactory.createDataSource("one_mysql");
} }

这样可以把名为 one_mysql 数据库数据源进行加载。

2 数据库信息结合配置模板

当然只有上面方式只适合数据库地址密码一致的情况下,库名不一致,注入多数据源。

下面方式支持数据库信息不一致情况下使用模板注入多数据源。

需要先配置 mysql (1 配置模板),另行加下下面配置。

配置:

config.datasource.mysql.source-info-map 包含 4 个信息 host-url数据库地址name数据库名称username数据库用户名password数据库密码

config.datasource.mysql.source-info-map.tow_mysql 里的 tow_mysql 为 map 集合的 key。

# mysql-datasource-spring-boot-starter
config.datasource.mysql.source-info-map.tow_mysql.host-url=127.0.0.1:3306
config.datasource.mysql.source-info-map.tow_mysql.name=tow_mysql
config.datasource.mysql.source-info-map.tow_mysql.username=root
config.datasource.mysql.source-info-map.tow_mysql.password=root

代码:

先在 DataSourceConfigProperties 对象里获取相应 SourceInfoMap 配置。

DataSourceConfigProperties.SourceInfo towMysq 配置通过 DataSourceFactory#createDataSource 方法进行创建即可。

/**
* {@link DataSourceConfigProperties} 配置方式生成 {@link DataSource}
*
* @author purgeyao
* @since 1.0
*/
@Configuration
public class TowDataSourceConfiguration { /**
* DataSourceFactory#createDataSource 方式加载 tow_mysql 数据库
*
* @param dataSourceFactory dataSourceFactory
* @return {@link DataSource}
*/
@Bean
public DataSource towDataSource(DataSourceFactory dataSourceFactory, DataSourceConfigProperties properties) {
DataSourceConfigProperties.SourceInfo towMysql = properties.getSourceInfoMap().get("tow_mysql");
if (towMysql == null) {
throw new IllegalArgumentException("未获取到相应配置");
}
return dataSourceFactory.createDataSource(towMysql);
} }

4 注解选择器结合模板配置(推荐写法)

@DataSourceSelector 注解可以使用配置模板生成相应数据源对象。

DataSourceSelector#value 为数据库配置key(详情2的配置), 其他写法和原有的数据库创建方法一致。

只是把原有的 @ConfigurationProperties(prefix = "spring.datasource.onemysql") 替换为 @DataSourceSelector("tow_mysql")

/**
* 注解方式注入 {@link DataSource}
*
* @author purgeyao
* @since 1.0
*/
@Configuration
public class AnnotationsDataSourceConfiguration { ... /**
* {@link DataSourceSelector} 方式选择注入 {@link DataSource}
*
* @return {@link DataSource}
*/
@DataSourceSelector("tow_mysql")
public DataSource selectorDataSource() {
return DataSourceBuilder.create().build();
}
}

总结

@DataSourceSelector("tow_mysql") 方式推荐使用。和之前的方法基本无差别, 简单方便点。

mysql 配置文件分开之后方便之后多个服务使用。

qq交流群: 812321371

微信交流群: MercyYao

示例代码地址:data-source-spring-boot

作者GitHub:

Purgeyao 欢迎关注

本文由博客一文多发平台 OpenWrite 发布!

SpringBoot-Mysql模板多数据源加载的更多相关文章

  1. iis发布后模板字体不能加载的解决方案

    在使用ace模板的过程中就曾遇到过图标不显示的情况, 1.在iis和vs运行都不能显示图标,添加缺失的字体库后可以访问 2.把项目签入到阿里云时再一次失效,解决方法是添加Mime类型 .woff  a ...

  2. django模板中自动加载static

    TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join( ...

  3. mysql_connect() 不支持 请检查 mysql 模块是否正确加载

    php的扩展 没有配置好! 打开php.ini文件: 搜索pdo_mysql和curl ;extension=php_curl.dll ;extension=pdo_mysql.dll 然后把2者前面 ...

  4. SpringBoot系列教程之Bean加载顺序之错误使用姿势辟谣

    在网上查询 Bean 的加载顺序时,看到了大量的文章中使用@Order注解的方式来控制 bean 的加载顺序,不知道写这些的博文的同学自己有没有实际的验证过,本文希望通过指出这些错误的使用姿势,让观文 ...

  5. nginx反向代理部署springboot项目报404无法加载静态资源

    问题:nginx反向代理部署springboot项目报404无法加载静态资源(css,js,jpg,png...) springboot默认启动端口为8080,如果需要通过域名(不加端口号)直接访问s ...

  6. SpringBoot集成Shiro 实现动态加载权限

    一.前言 本文小编将基于 SpringBoot 集成 Shiro 实现动态uri权限,由前端vue在页面配置uri,Java后端动态刷新权限,不用重启项目,以及在页面分配给用户 角色 . 按钮 .ur ...

  7. javascript模板库jsrender加载并缓存外部模板文件

    前一篇说了jsrender嵌套循环的使用,在SPA的应用中,广泛使用的一个点就是view模板,使用了SPA之后,每个业务页面不再是独立的html,仅仅是一个segment,所以通常这些segment会 ...

  8. springboot启动的时候排除加载某些bean

    由于公司把redis相关的配置类,工具类放在了一个类似common的工程里,这样以后肯定不可避免的出现某些项目可能并不需要使用redis,但是还是依赖common里的别的一些类库 所以排除spring ...

  9. 尚硅谷springboot学习13-配置的加载

    配置可以有很多不同的来源,也有不同的加载顺序,下面来具体的看一下 配置文件加载位置 spring boot 启动会扫描以下位置的application.properties或者application. ...

随机推荐

  1. toString(),String.valueOf,(String)在处理空对象时的区别

    public static void main(String[] args) { Map<String,Object> map = new HashMap<>(); map.p ...

  2. 使用gdb调试c++程序

    上篇(使用c++开发跨平台程序)说到,我不怕造东西,我怕的是造出来的东西,如果出了问题,我却不知道原因.所以调试分析是一个重要的手段. C++调试是一个复杂的活.虽然大部分调试可以通过IDE在开发期间 ...

  3. JAVASE知识点总结(三)

    第十六章:抽象类和接口 一.抽象方法:在方法面前加了abstract(为了解决,子类必须要覆盖此方法,在定义的时候不要方法体). 特点:1.抽象方法没有方法体. 2.抽象方法必须放在抽象类(类前面加上 ...

  4. mysql 时间与字符串相互转换

    时间.字符串.时间戳之间的相互转换:date转字符串.date转时间戳.字符串转date.字符串转时间戳.时间戳转date,时间戳转字符串用法 涉及的函数 date_format(date, form ...

  5. sklearn 标准化数据的方法

    Sklearn 标准化数据 from __future__ import print_function from sklearn import preprocessing import numpy a ...

  6. 基于C#的机器学习--机器学习建模的基础

    构建ML模型的步骤 现在我们已经看了解到了一些ML应用程序的例子,问题是,我们如何构建这样的ML应用程序和系统? 下图总结了我们使用ML开发应用程序的方法,我们将在下面更详细地讨论这个问题: 如上图所 ...

  7. 架构——android架构演进概述

    随着业务的发展和技术的变更,Android开发也经历了以下几个发展阶段: 看似高大上的名词,其实遵循着最简单的原则:分而治之(如何划分就是"架构",简单的事情如何串在一起就是&qu ...

  8. 自适应布局display:-webkit-box的用法

    在web布局中,我们经常使用的是display:inline-block,display:flex,这些,但其实在进行移动端设备自适应布局中,-webkit-box布局更加合适 不同的浏览器有不同的前 ...

  9. 洛谷:P5072 [Ynoi2015]盼君勿忘

    原题地址:https://www.luogu.org/problem/P5072 题目简述 给定一个序列,每次查询一个区间[l,r]中所有子序列分别去重后的和mod p 思路 我们考虑每个数的贡献.即 ...

  10. Spring Boot 2.X(四):Spring Boot 自定义 Web MVC 配置

    0.准备 Spring Boot 不仅提供了相当简单使用的自动配置功能,而且开放了非常自由灵活的配置类.Spring MVC 为我们提供了 WebMvcConfigurationSupport 类和一 ...