作者:码农教程

出自:码农教程

原文: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),结果:

spring boot 切换 oracle 和 mysql_spring-boot多数据源动态切换相关推荐

  1. Spring+Mybatis多数据源配置(四)——AbstractRoutingDataSource实现数据源动态切换

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  2. springboot使用mybatis多数据源动态切换的实现

    需求:项目使用了读写分离,或者数据进行了分库处理,我们希望在操作不同的数据库的时候,我们的程序能够动态的切换到相应的数据库,执行相关的操作. 首先,你需要一个能够正常运行的springboot项目,配 ...

  3. SpringBoot+AOP实现多数据源动态切换

    SpringBoot+AOP实现多数据源动态切换 背景 设计总体思路 步骤 背景 系统后端需要访问多个数据库,现有的数据库连接配置写入配置文件中.后端需要从一个数据库的配置表里动态的读取其它mysql ...

  4. Proxool配置多数据源动态切换

    2019独角兽企业重金招聘Python工程师标准>>> 前段时间遇到多数据源动态切换问题,总结一下,做个记录,以备后续之需! 首先附上proxool连接池的配置方法:http://3 ...

  5. springboot多数据源动态切换和自定义mybatis分页插件

    1.配置多数据源 增加druid依赖 完整pom文件 数据源配置文件 route.datasource.driver-class-name= com.mysql.jdbc.Driver route.d ...

  6. Spring-Boot + AOP实现多数据源动态切换

    2019独角兽企业重金招聘Python工程师标准>>> 最近在做保证金余额查询优化,在项目启动时候需要把余额全量加载到本地缓存,因为需要全量查询所有骑手的保证金余额,为了不影响主数据 ...

  7. spring boot多数据源动态切换, 多数据源事务管理

    1 . 项目目标 实现 不同数据源的切换 (使用AbstractRoutingDataSource) 不同数据源之间,事物管理,多个数据源之间同时commit或者同时rollback 兼容不同的连接池 ...

  8. spring 多数据源动态切换

    理解spring动态切换数据源,需要对spring具有一定的了解 工作中经常遇到读写分离,数据源切换的问题,那么以下是本作者实际工作中编写的代码  与大家分享一下! 1.定义注解 DataSource ...

  9. 手把手教你玩多数据源动态切换

    为了提高应用的可靠性,多数据源现在也很常见,数据库可以搭建双 M 结构,这个松哥之前也发文和大家分享过如何搭建双 M 结构的主从备份?,那么 Java 代码里该如何操作多数据源呢? 我在 19 年的时 ...

最新文章

  1. PHP分页类(较完美)
  2. MySQL命令行登陆,远程登陆MySQL
  3. 介绍两款Docker可视化工具
  4. 一键了结CUP100%问题
  5. LeetCode 77. 组合(回溯)
  6. 高中学生计算机软件,中学生计算器
  7. Java 开发的编程噩梦,这些坑你没踩过算我输
  8. 关于SQL的Group By
  9. bboss_spring_struts2_myibatis对比分析
  10. tar、rpm和yum总结
  11. adb网络连接调试,重启之后失效
  12. 生物化学 核磁共振 氢谱 n+1定律 邻碳耦合 同碳耦合
  13. 长沙理工大学本科毕业论文答辩和论文选题PPT模板
  14. ospf状态机-通俗易懂的小故事
  15. execute与executeUpdate的区别(学习笔记)
  16. 后端程序员必备的 Linux 基础知识
  17. ThinkPHP导入Excel文件到数据库的简单实现
  18. 深入浅出对抗性机器学习(AML)
  19. c语言错误c2198,这段哪里错了。。。
  20. mysql查询中位数

热门文章

  1. [optee]-optee中的异常向量表的实现
  2. 验证异常处理调用顺序
  3. win32 实现死锁的小例子
  4. Windows异常学习笔记(二)—— 内核异常处理流程用户异常的分发
  5. 【laravel】docker 部署laravel 遇到的问题?
  6. ACM入门之【最短路】
  7. lambda表达式的日期问题
  8. docker tag 删除images_深入浅出 Docker (二) —— Docker的基本概念和架构原理
  9. python里res有什么用_python – 为什么在tensorflow中构建resnet模型时使用固定填充...
  10. 【Java自顶向下】面试官:HashMap源码看过吗?我:看过!面试官:好极了,那么来扒一扒吧!