由于废话有点多先说结论
总共就三步没什么内容
- 数据库(xxx-jdbc)和@DS (dynamic)两个依赖
- yml配置datasource
- 用到其他 非 主数据源的方法上添加注解@DS("数据源名字")
- 注意事项
目录
第一步 前置条件
在原有的基础上 (之前的单数据库 的项目能运行的基础上)
添加依赖 mybatisplus提供的dynamic 和 第二个数据库的驱动
<!-- dynamic配置工具 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${mybatis-plus-dynamic.version}</version>
</dependency>
<!-- 这里添加第二个数据库 根据自己需求添加相应的驱动依赖 -->
<!-- 我用的第二个数据库是时序数据库 TDengine -->
<dependency>
<groupId>com.taosdata.jdbc</groupId>
<artifactId>taos-jdbcdriver</artifactId>
<version>3.2.2</version>
</dependency>
第二步 yml配置
修改yml配置文件
原来的配置 ↓
spring:
application:
name: iot-cloud
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
password: root
username: root
url: jdbc:mysql://localhost:3306/easyiot?serverTimezone=GMT%2B8&rewriteBatchedStatements=true
修改后 ↓ (注意这里写了两个datasource: 别漏了-也注意一下缩进对齐)
spring:
application:
name: iot-cloud
datasource:
dynamic:
#设置默认的数据源或者数据源组-默认值即为mysql
primary: mysql
datasource:
mysql:
driver-class-name: com.mysql.cj.jdbc.Driver
password: root
username: root
url: jdbc:mysql://localhost:3306/easyiot?serverTimezone=GMT%2B8&rewriteBatchedStatements=true
taos:
driver-class-name: com.taosdata.jdbc.rs.RestfulDriver
password: root
username: root
url: jdbc:TAOS-RS://192.168.0.80:6041/history_sensor_data?timezone=UTC-8&charset=UTF-8&locale=en_US.UTF-8
其他数据库例子(数据源命名master还是mysql还是oracle都无所谓记住命名就行)
注意修改后的yml字体颜色橙色与黄色才是正确的
错误示例 ↓
如果出现警告提示"Cannot resolve...."肯定是哪里写错了或是缩进没弄好
第三步 运行测试
先说结果直接在需要用到其他数据源的方法上添加@DS("xxx")
示例
@DS("taos")
@RequestMapping("sqlTest/taos")
public List<IotHistorySensorData> test2() {
return mapper.selectTaos();
}
@DS可以直接加载serviceImpl具体某个方法上(不加@DS就是默认数据库mysql)
结尾有注意事项
---
先启动项目确保能运行
随便开放一个新controller接口用来测试
先测试原来的(不能加了新数据库原来的反而不能用了,所以先测试原来的接口看看)
然后写一下第二个数据库的sql语句 直接写mybatis的mapper就行了没什么特殊的
然后调用
和原来不同的地方是在调用的方法上添加了一个@DS("xxx")注解
xxx就是刚刚在yml中配置的数据源名字
运行访问接口
注意事项
@DS无效情况:
- 注解添加service(Service 接口)无效
- 注解添加service(Service 接口)的方法上无效
- 注解添加到mapper接口类上无效
- 数据源名称最好不要包含下滑线 下滑线的数据源切换不了
- 测试的时候在private方法上@DS失效了不知道是不是该类没有注入Spring的原因, 放在service和controller里@DS就没问题
@Transactional 事务无效
还有用到多数据源的方法上使用事务@Transactional好像会有问题
简单说一下
// 将代码修改如下, 两个方法设置事务传播机制为「propagation = Propagation.REQUIRES_NEW」
// 原:
@Transactional(rollbackFor = RuntimeException.class)
// 改为 (原来可能只有一个@Transactional,改完后好像要改成用到的每个方法都加上这句话)
@Transactional(rollbackFor = RuntimeException.class, propagation = Propagation.REQUIRES_NEW)
由于这里还没遇到这种需求-大家自己网上看看吧