1、启动两个mysql,可以按照如下操作使用docker来部署mysql容器,比较简单

https://www.cnblogs.com/qq931399960/p/11527222.html

2、如果配置了多个数据源,则默认的数据源配置就不再生效了,如果配置两个数据源,则两个数据都需要自定义,找到javax.sql.DataSource接口,F4查看其实现类

单数据源使用自动配置时的配置

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.101.116:3306/myapp001?useSSL=false
spring.datasource.username=root
spring.datasource.password=12345
spring.datasource.hikari.maximum-pool-size=20

3、我们使用的为HikariCP连接池,所以需要实例化HikariDataSource,进入到该类源码中,发现其继承了HikariConfig,进入HikariConfig,可以看到一些很熟悉的属性,不过当前测试时指挥使用到一些简单配置

通过https://www.cnblogs.com/qq931399960/p/11523723.html了解到,springboot可以通过@ConfigurationProperties注解批量的把参数注入到实体类中,所以我们就可以定义自己的数据源了

多个数据源配置及测试

为了方便测试,注入数据源后,使用JdbcTemplate来操作数据库

端口3306的myapp001数据库中,user表存在三条数据

mysql> use myapp001;
Database changed
mysql> select * from user;
+------+------+
| id | name |
+------+------+
| 1 | aa |
| 2 | bb |
| 3 | cc |
+------+------+
3 rows in set (0.04 sec)

端口3307的myapp002数据库中,uer表数据为空

mysql> use myapp002;
Database changed
mysql> select * from user;
Empty set (0.02 sec)

1、配置数据源

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.jdbc-url=jdbc:mysql://192.168.101.116:3306/myapp001?useSSL=false
spring.datasource.username=root
spring.datasource.password=12345
spring.datasource.maximum-pool-size=30 spring.datasource.app.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.app.jdbc-url=jdbc:mysql://192.168.101.116:3307/myapp002?useSSL=false
spring.datasource.app.username=root
spring.datasource.app.password=12345
spring.datasource.app.maximum-pool-size=20

2、注入数据源和JdbcTemplate

package com.demo.bootdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.core.JdbcTemplate; import com.zaxxer.hikari.HikariDataSource; @SpringBootApplication
public class MultidatasourceApplication { public static void main(String[] args) {
SpringApplication.run(MultidatasourceApplication.class, args);
} @Bean("datasource")
@ConfigurationProperties("spring.datasource")
public HikariDataSource datasource() {
return new HikariDataSource();
} @Bean("jdbcTemplate")
public JdbcTemplate jdbcTemplate() {
return new JdbcTemplate(datasource());
} @Bean("datasourceapp")
@ConfigurationProperties("spring.datasource.app")
public HikariDataSource datasourceapp() {
return new HikariDataSource();
} @Bean("jdbcTemplateApp")
public JdbcTemplate jdbcTemplateApp() {
return new JdbcTemplate(datasourceapp());
} }

3、测试输出

package com.demo.bootdemo;

import java.util.List;
import java.util.Map; import javax.annotation.Resource; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component; @Component
public class MainBusi implements CommandLineRunner { private Logger logger = LoggerFactory.getLogger(MainBusi.class); @Resource
private JdbcTemplate jdbcTemplate; @Resource
private JdbcTemplate jdbcTemplateApp; @Override
public void run(String... args) throws Exception { List<Map<String, Object>> queryForList = jdbcTemplate.queryForList("select * from user");
logger.info(queryForList.toString()); List<Map<String, Object>> queryForList2 = jdbcTemplateApp.queryForList("select * from user");
logger.info(queryForList2.toString()); } }

启动程序,查看输出结果,截取其中关键部分如下,可以看到,两个数据源的配置都是正确的,如果还需要其他参数

2019-09-16 16:01:45.359  INFO 67868 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2019-09-16 16:01:45.556 INFO 67868 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2019-09-16 16:01:45.689 INFO 67868 --- [ main] com.demo.bootdemo.MainBusi : [{id=1, name=aa}, {id=2, name=bb}, {id=3, name=cc}]
2019-09-16 16:01:45.690 INFO 67868 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-2 - Starting...
2019-09-16 16:01:45.749 INFO 67868 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-2 - Start completed.
2019-09-16 16:01:45.757 INFO 67868 --- [ main] com.demo.bootdemo.MainBusi : []

测试两个数据源,其中一个使用默认自动配置

其实主要区别为url,自定义的HikariDataSource需要使用jdbc-url,而默认的为url,将3306端口的jdbc-url改为url

spring.datasource.url=jdbc:mysql://192.168.101.116:3306/myapp001?useSSL=false

注释或者删除对默认数据源及JdbcTemplate代码

//    @Bean("datasource")
// @ConfigurationProperties("spring.datasource")
// public HikariDataSource datasource() {
// return new HikariDataSource();
// }
//
// @Bean("jdbcTemplate")
// public JdbcTemplate jdbcTemplate() {
// return new JdbcTemplate(datasource());
// }

启动程序,可以发现当前只有一个数据源,jdbcTemplate和jdbcTemplateApp使用到的数据源是相同的。都是使用的自定义的数据源。通过该例子可知,一旦自定义了数据源,则之前默认的数据源就不再生效

2019-09-16 16:08:48.235  INFO 71488 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2019-09-16 16:08:48.660 INFO 71488 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2019-09-16 16:08:48.689 INFO 71488 --- [ main] com.demo.bootdemo.MainBusi : []
2019-09-16 16:08:48.692 INFO 71488 --- [ main] com.demo.bootdemo.MainBusi : []
2019-09-16 16:08:48.697 INFO 71488 --- [ Thread-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2019-09-16 16:08:48.707 INFO 71488 --- [ Thread-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.

springboot官网配置多个数据源

两种方式

一、使用DataSourceBuilder来创建

参考如下章节第一部分

这种方式如果使用的为HikarDataSource,则需要将配置中的url改为jdbc-url

二、多个配置前缀来创建,基本配置与连接池配置分开(类似于springboot的自动配置)

在springboot官网有上述一段描述,上述文字下面就是两个数据源配置的具体代码,并且看这意思,是说如果有两个数据源,必须将其中的一个设置为Primary,上述的方式没有用到springboot官方提供的的配置,不过也没发现问题,不过也可以添加上Primary注解,不影响结果.在这里也有一行描述

If you create your own DataSource, the auto-configuration backs off,解释了上面“测试两个数据源,其中一个使用默认自动配置”的现象。

下面就按照官网的解释,声明两个数据源,并使用JdbcTemplate测试

1、配置

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.101.116:3306/myapp001?useSSL=false
spring.datasource.username=root
spring.datasource.password=12345
spring.datasource.pool.maximum-pool-size=30 ## 注意前缀,要与获取数据源时@ConfigurationProperties注解的一致,否则连接池配置不生效,下同 spring.datasource.app.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.app.url=jdbc:mysql://192.168.101.116:3307/myapp002?useSSL=false
spring.datasource.app.username=root
spring.datasource.app.password=12345
spring.datasource.app.pool.maximum-pool-size=20

2、注入数据源和JdbcTemplate

package com.demo.bootdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate; import com.zaxxer.hikari.HikariDataSource; @SpringBootApplication
public class MultidatasourceApplication { public static void main(String[] args) {
SpringApplication.run(MultidatasourceApplication.class, args);
} @Bean
@Primary
@ConfigurationProperties("spring.datasource")
public DataSourceProperties datasourcepro() {
return new DataSourceProperties();
} @Bean
@Primary
@ConfigurationProperties("spring.datasource.pool")
public HikariDataSource datasource() {
return datasourcepro().initializeDataSourceBuilder().type(HikariDataSource.class).build();
} @Bean("jdbcTemplate")
@Primary
public JdbcTemplate jdbcTemplate() {
return new JdbcTemplate(datasource());
} @Bean
@ConfigurationProperties("spring.datasource.app")
public DataSourceProperties datasourceproApp() {
return new DataSourceProperties();
} @Bean
@ConfigurationProperties("spring.datasource.app.pool") // 该配置对应配置文件中连接池的配置信息,否则连接池配置不生效
public HikariDataSource datasourceApp() {
return datasourceproApp().initializeDataSourceBuilder().type(HikariDataSource.class).build();
} @Bean("jdbcTemplateApp")
public JdbcTemplate jdbcTemplateApp() {
return new JdbcTemplate(datasourceApp());
} }

3、输出结果

2019-09-16 16:28:14.351  INFO 70720 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2019-09-16 16:28:14.574 INFO 70720 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2019-09-16 16:28:14.601 INFO 70720 --- [ main] com.demo.bootdemo.MainBusi : [{id=1, name=aa}, {id=2, name=bb}, {id=3, name=cc}]
2019-09-16 16:28:14.601 INFO 70720 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-2 - Starting...
2019-09-16 16:28:14.621 INFO 70720 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-2 - Start completed.
2019-09-16 16:28:14.638 INFO 70720 --- [ main] com.demo.bootdemo.MainBusi : []

与我们期望的一致,而且这里面的配置和单机使用的时候是一致的,而且使用springboot官网的多个数据源配置,几乎所有的参数配置中映射到实体类中的key和单数据源都是一样的,不需要做特殊的改动。建议还是用springboot官方推荐的这种方式来实现多个数据源。

springboot多个数据源的更多相关文章

  1. springboot添加多数据源连接池并配置Mybatis

    springboot添加多数据源连接池并配置Mybatis 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9190226.html May 12, 2018  ...

  2. springboot之多数据源配置JdbcTemplate

    springboot多数据源配置,代码如下 DataSourceConfig package com.rookie.bigdata.config; import org.springframework ...

  3. springboot配置Druid数据源

    springboot配置druid数据源 Author:SimpleWu springboot整合篇 前言 对于数据访问层,无论是Sql还是NoSql,SpringBoot默认采用整合SpringDa ...

  4. springboot+ibatis 多数据源配置

    这个是boot基本版本包,因为我用的打包方式是war所以去除掉了boot内置的tomcat,但是为了方便测试又引入了内置tomcat,只要添加<scope>provided</sco ...

  5. spring-boot (四) springboot+mybatis多数据源最简解决方案

    学习文章来自:http://www.ityouknow.com/spring-boot.html 配置文件 pom包就不贴了比较简单该依赖的就依赖,主要是数据库这边的配置: mybatis.confi ...

  6. springBoot整合多数据源

    springBoot整合相关 1:springBoot整合多数据源: 应用场景:     项目需要同时连接两个不同的数据库A, B,并且它们都为主从架构,一台写库,多台读库. 工具/版本: jdk1. ...

  7. SpringBoot配置多数据源时遇到的问题

    SpringBoot配置多数据源 参考代码:Spring Boot 1.5.8.RELEASE同时配置Oracle和MySQL 原作者用的是1.5.8版本的SpringBoot,在升级到2.0.*之后 ...

  8. springboot + mybatis + 多数据源

    此文已由作者赵计刚薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构: 简要原理: 1) ...

  9. 基于springboot的多数据源配置

    发布时间:2018-12-11   技术:springboot1.5.1 + maven3.0.1+ mybatis-plus-boot-starter2.3.1 + dynamic-datasour ...

  10. SpringBoot 的多数据源配置

    最近在项目开发中,需要为一个使用 MySQL 数据库的 SpringBoot 项目,新添加一个 PLSQL 数据库数据源,那么就需要进行 SpringBoot 的多数据源开发.代码很简单,下面是实现的 ...

随机推荐

  1. .net工作流引擎ccflow集成并增加自定义功能

    一.为什么需要自定义扩展 1.第三方类库已满足大部分需求,剩下的根据具体业务需求抽象成公共功能进行扩展 2.第三方呈现的web页面与原类库耦合度较高,希望在原页面上扩展而不影响原来的功能 3.在完全不 ...

  2. BPM软件_K2再度入选Gartner iBPMS MQ挑战者象限_全球领先的工作流引擎

    在Gartner 于1月最新发布的2018 iBPMS MQ报告中,K2再度入选“挑战者”象限,相较去年,K2在“前瞻性”方面有了显著提升. Gartner对该标准的定义为:供应商对市场具有清晰认识, ...

  3. Python3 GUI:PyQt5环境搭建

    配置镜像源 最近用Python内置的Thinter写了个小工具,发现界面略朴素,于是决定转向PyQt5.先配置镜像源,否则只能龟速下载. C:\Users\你的用户名下新建目录pip 在pip目录下新 ...

  4. 【Day2】4.第三方模块的安装与使用

    课程目标 1. 使用模块 2. 安装第三方模块 使用模块 • 一个.Py文件称之为一个模块(Module) • 好处: 1. 便于代码维护,把很多函数放到不同文件,一个.py文件 的 代码数量少 2. ...

  5. TcxComboBoxProperties下拉框填充

    原文地址:https://www1.devexpress.com/Support/Center/Question/Details/CQ30369 Actually, the corresponding ...

  6. 02 js原型链

    1 js原型链是一个绕不开的话题.直接上说吧. /** * 1. js里的原型链是怎么样的? 带class 和不带class的原型链的不同. */ const util = require('util ...

  7. 关于Linux连接工具mobaxterm显示中文乱码问题

    本人用的是MobaXterm Personal 9.1版本.近期发现连接上服务器,查看日志时,发现中文乱码,无法正常显示.甚是苦恼.百度搜索该工具显示乱码问题,无一人解决.提倡更换连接工具.无意间发现 ...

  8. TF_Variable Sharing

    Reference: http://jermmy.xyz/2017/08/25/2017-8-25-learn-tensorflow-shared-variables/ Tensorflow does ...

  9. (转)再过半小时,你就能明白kafka的工作原理了

    为什么需要消息队列 周末无聊刷着手机,某宝网APP突然蹦出来一条消息“为了回馈老客户,女朋友买一送一,活动仅限今天!”.买一送一还有这种好事,那我可不能错过!忍不住立马点了去.于是选了两个最新款,下单 ...

  10. 题解 [51nod1771] 最小生成树中的边

    题面 解析 这题好像没人写过啊(所以好像没题解)... 然后刚了一天才写出来摆了半天. 其实一开始是想错了, 写了个\(O(n^2)\)的近似于暴力的方法. 就是对于每组权值相等的边, 对于每条边先把 ...