SpringBoot-Mysql模板多数据源加载
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配置模板。
功能使用
添加依赖
<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 配置文件分开之后方便之后多个服务使用。