SpringBoot yml配置多数据源,持久层自动切换数据源
SpringBoot yml文件中配置多数据源连接方式springboot配置多数据源,持久层实现自动切换pom文件配置application.yml配置配置一个控制器,并启动程序(启动类无需进行配置,pom依赖导入后,直接在持久层接口使用@DS()注解即可)最主要的变化是持久层接口测试当前文章是持久层注解实现数据源切换,jdbc实现数据源切换请点击springboot配置多数据源,持久层实现自动
SpringBoot yml文件中配置多数据源连接方式
当前文章是持久层注解实现数据源切换,jdbc实现数据源切换请点击
springboot配置多数据源,持久层实现自动切换
原使用jdbc方式进行连接,现需要改为在xml文件中实现查询
pom文件配置
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.5.7</version>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>21.1.0.0</version>
</dependency>
<!-- 持久层自动切换数据源,主要依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
</dependencies>
注意一:上方pom中主要支持持久层数据自动切换的依赖是
可以直接copy到本地,防止导包失败
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
application.yml配置
server:
port: 80
spring:
datasource:
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master
strict: false #设置严格模式,默认false不启动,启动后在未匹配到指定数据源时,会抛出异常,不启动则使用默认数据源
datasource:
master: #主数据源
username: username
password: password
url: jdbc:oracle:thin:@ip:1521:newtest
driver-class-name: oracle.jdbc.OracleDriver
db2: #子数据源
username: username2
password: password2
url: jdbc:oracle:thin:@ip:1521:newtest
driver-class-name: oracle.jdbc.OracleDriver
注意二:当前的数据源和springboot中的数据源配置有差别,使用
dynamic-datasource-spring-boot-starter包实现的数据源,
在datasource属性下,会多一个dynamic属性切记不要遗漏了,
可以直接将上方配置copy到项目修改一下数据连接参数,及数据库名称可以替换master,db2可以设置成自己需要的名称,primary属性指定主数据源名称为自己定义的主数据源的名称
配置一个控制器,
启动程序(启动类无需进行配置,pom依赖导入后,直接在持久层接口使用@DS()注解即可)
package com.heiaxin.demo.controller.DemoController;
import com.heiaxin.demo.service.DemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
@RestController
public class DemoController {
@Autowired
DemoService service;
@GetMapping("/getDemo1")
public List<Map> getDemo1() throws SQLException {
return serivce.getDemo1();
}
@GetMapping("/getDemo2")
public List<Map> getDemo2() throws SQLException {
return serivce.getDemo2();
}
}
最主要的变化是持久层接口
@Mapper
public interface DemoMapper{
Integer getDemo();
@DS("db2) // 设置getDemo2方法使用数据源db2进行查询
Integer getDemo2();
}
整体来讲配置好数据源后,只需要在需要切换数据源的Mapper层接口上加上@DS(“”)注解即可,“”中测试yml中配置的数据源名称。
测试
直接在流程器访问:http://localhost/getDemo1,http://localhost/getDemo2 ,
这里demo1和demo2可以在xml中写一个不同数据源,同表的count(1) 查询,将master数据源同表数据insert10条,db2同表数据insert20条,页面上会展示getDemo1为10,getDemo2为20.
补充:
多数据中的service,业务层使用@Transactional,导致使用数据源2的mapper层报错或最终查询的结果是主数据源中的数据原因,…暂未整理
解决方式,通过try{}catch去手动触发事务回滚
手动回滚代码
TransactionAspectSupport.currentTransactionStatus();
更多推荐
所有评论(0)