spring boot 多数据源_spring-boot多数据源动态切换

该博客介绍了如何在Spring Boot项目中实现多数据源的动态切换,包括Maven依赖配置、数据源信息配置、动态数据源切换类、多数据源配置类、自定义@DataSource注解、AOP切面类以及启动配置。通过实例展示了如何在服务层根据注解选择不同的数据源执行SQL查询。
摘要由CSDN通过智能技术生成

0e1a4d01ff84b60193c88ddcb28ca0e4.png

作者:码农教程

出自:码农教程

原文:manongjc.com/detail/14-ucsldoihyzmwcui.html


当项目中存在多数据源时,就涉及到数据源的动态切换,通过研究,特此记录一下。

1,maven依赖

<!-数据库连接->
<依赖性>
            <groupId> com.oracle </ groupId>
            <artifactId> ojdbc6 </ artifactId>
            <version> 11.2.0.4 </ version>
            <scope>运行时</ scope>
        </ dependency>
<!-数据库连接池->
<依赖性>
            <groupId> com.alibaba </ groupId>
            <artifactId> druid-spring-boot-starter </ artifactId>
            <version> 1.1.10 </ version>
        </ dependency>
        <依赖性>
            <groupId> org.springframework.boot </ groupId>
            <artifactId> spring-boot-starter-jdbc </ artifactId>
        </ dependency>
<!-aop->
<依赖性>
            <groupId> org.springframework.boot </ groupId>
            <artifactId> spring-boot-starter-aop </ artifactId>
        </ dependency>

2,多数据源信息配置

#多数据源测试
弹簧:
  数据源:
    德鲁伊:
     主:
        驱动程序-类-名称:oracle.jdbc.driver.OracleDriver
        用户名:test
        密码:测试
        网址:jdbc:oracle:thin:@ // ip1:1521 / orcl 
     slave:
        驱动程序-类-名称:oracle.jdbc.driver.OracleDriver
        用户名:test
        密码:测试
        网址:jdbc:oracle:thin:@ // ip2:1521 / orcl

3,数据源配置信息转换成实体类

@ConfigurationProperties(prefix =“ spring.datasource.druid” )
@数据
@零件
公共 类DataSourceProperties {
    私有Map <String,String> master;
    私有Map <String,String>从属;
}

4,动态数据源切换类

公共 类DynamicDataSource扩展AbstractRoutingDataSource {

    私有 静态 最终ThreadLocal <String> contextHolder = new ThreadLocal <> ();

    公开DynamicDataSource(DataSource defaultTargetDataSource,Map <Object,Object> targetDataSources){
         super .setDefaultTargetDataSource(defaultTargetDataSource);
        超级.setTargetDataSources(targetDataSources);
        超级.afterPropertiesSet();
    }


    @Override
    受保护的对象defineCurrentLookupKey(){
         return getDataSource();
    }

    公共 静态 无效setDataSource(String dataSource){
        contextHolder.set(dataSource);
    }

    公共 静态字符串getDataSource(){
         return contextHolder.get();
    }

    公共 静态 无效clearDataSource(){
        contextHolder.remove();
    }
}

5,多数据源配置类

@Configuration
公共 类DynamicDataSourceConfig {

    @豆角,扁豆
    公共数据源主控(@Autowired DataSourceProperties dataSourceProperties){
        DruidDataSource druidDataSource =新的DruidDataSource();
        映射<String,String> master = dataSourceProperties.getMaster();
        druidDataSource.setUsername(master.get( “ username” ));
        druidDataSource.setPassword(master.get( “ password” ));
        druidDataSource.setUrl(master.get( “ url” ));
        //其他参数配置省略
        返回druidDataSource;
    }

    @豆角,扁豆
    公用DataSource从属(@Autowired DataSourceProperties dataSourceProperties){
        DruidDataSource druidDataSource =新的DruidDataSource();
        映射<String,String> slave = dataSourceProperties.getSlave();
        druidDataSource.setUsername(slave.get( “ username” ));
        druidDataSource.setPassword(slave.get( “ password” ));
        druidDataSource.setUrl(slave.get( “ url” ));
        //其他参数配置省略
        返回druidDataSource;
    }

    @豆角,扁豆
    @主
    公共DynamicDataSource数据源(数据源主数据源,数据源从数据){
        映射<Object,Object> map = new HashMap <>(4 );
        map.put( “ master” ,master);
        map.put( “ slave” ,slave);
        返回 新的DynamicDataSource(master,map);
    }
}

6,自定义@DataSource注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @ interface数据源{

    字符串name()默认为“ master” ;
}

7,Aop切面类配置

@零件
@方面
公共 类DataSourceAspect {

    @Pointcut( “ @annotation(com.zxgeo.sso.muiltDatasource.anons.DataSource)” )
    公共 无效dataSourcePointCut(){}

    @Around(value =“ dataSourcePointCut()” )
    围绕(ProceedingJoinPoint点)的公共对象抛出Throwable {
        MethodSignature签名= (MethodSignature)point.getSignature();
        方法method = signature.getMethod();

        数据源的dataSource = method.getAnnotation(数据源。类);
        如果(dataSource == null ){
            DynamicDataSource.setDataSource( “ master” );
        }其他{
            DynamicDataSource.setDataSource(dataSource.name());
        }
        尝试{
             return point.proceed();
        }最后{
            DynamicDataSource.clearDataSource();
        }
    }
}

8,启动配置注解信息,重要(不然运行会报错)

@SpringBootApplication(排除= {DataSourceAutoConfiguration。类})

9,测试

(1),服务层(此处没有使用mybatis)

@Service
公共 类TestService {

    @Autowired
    私有javax.sql.DataSource dataSource;

    @数据源
    公共Map <String,Object> getMasterDataSource()抛出SQLException {
        连接连接= dataSource.getConnection();
        映射<String,Object>映射;
        尝试(PreparedStatement prepareStatement
                      = connection.prepareStatement(“ SELECT * FROM AA WHERE A = 10001” )){
            ResultSet resultSet = prepareStatement.executeQuery ();
            map = new HashMap <> ();
            同时(resultSet.next()){
                map.put( “ A”,resultSet.getString(“ A” ));
                map.put( “ B”,resultSet.getString(“ B” ));
                map.put( “ C”,resultSet.getString(“ C” ));
            }
        }
        返回地图
    }
    @DataSource(name =“ slave” )
     public Map <String,Object> getSlaveDataSource()引发SQLException {
        连接连接= dataSource.getConnection();
        映射<String,Object>映射;
        尝试(PreparedStatement prepareStatement
                      = connection.prepareStatement(“ SELECT * FROM AA WHERE A = 10002” )){
            ResultSet resultSet = prepareStatement.executeQuery ();
            map = new HashMap <> ();
            同时(resultSet.next()){
                map.put( “ A”,resultSet.getString(“ A” ));
                map.put( “ B”,resultSet.getString(“ B” ));
                map.put( “ C”,resultSet.getString(“ C” ));
            }
        }
        返回地图
    }
}

(2),单元测试

@SpringBootTest
@RunWith(SpringRunner。类)
类SsoApplicationTests {

    @Autowired
    私有  TestService testService;

    @测试
    公共 无效muliDatasorce()抛出SQLException {
        映射<String,Object> masterDataSourceUrl = testService.getMasterDataSource();
        System.out.println(masterDataSourceUrl);
        映射<String,Object> slaveDataSourceUrl = testService.getSlaveDataSource();
        System.out.println(slaveDataSourceUrl);
    }
}

(3),结果:

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值