当前文章是持久层注解实现数据源切换,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();
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐