当前位置: 首页 > article >正文

springboot配置oracle+达梦数据库多数据源配置并动态切换

项目场景:

在工作中很多情况需要跨数据库进行数据操作,自己总结的经验希望对各位有所帮助


问题描述

总结了几个问题

1.识别不到mapper

2.识别不到xml

3.找不到数据源


原因分析:

1.配置文件编写导致识别mapper

2.配置类编写建的格式有问题

3.命名问题大小写


解决方案:

1.检查application配置文件的扫描是否开启路径是否正确

2.检查配置文件的拼写缩进,application的拼写缩进特别严格建议自己写不要粘贴复制

3.命名大小写或者多字母少字母导致找不到

配置相关代码:

在config新建几个数据配置文件用于访问和切换数据源

DatasourceConfig类

这里是通过

ConfigurationProperties注解获取映射你application的数据源名称这里不要写错一定注意

然后交给bean管理;

下面的

dynamicDataSource是调用spring自带的一个的抽象类用于切换数据源使用的
@Bean("db1")
@ConfigurationProperties(prefix = "spring.datasource.db1")
public DataSource dataSourceOne(){
    return DataSourceBuilder.create().build();
}
@Bean("db2")
@ConfigurationProperties(prefix = "spring.datasource.db2")
public DataSource dataSourceTwo(){
    return DataSourceBuilder.create().build();
}
@Bean(name = "dynamicDataSource")
@Primary
public DataSource dynamicDataSource(@Qualifier("db1") DataSource db1,@Qualifier("db2") DataSource db2){
    DynamicDataSource dynamicDataSource = new DynamicDataSource();
    dynamicDataSource.setDefaultTargetDataSource(db1);
    HashMap<Object, Object> dsMap = new HashMap<>();
    dsMap.put("db1",db1);
    dsMap.put("db2",db2);
    dynamicDataSource.setTargetDataSources(dsMap);
    return dynamicDataSource;
}
@Bean
public PlatformTransactionManager transactionManager(@Qualifier("dynamicDataSource") DataSource dynamicDataSource){
    return new DataSourceTransactionManager(dynamicDataSource);
}
DynamicDataSource类

determineCurrentLookupKey用来指定数据源这里获取到传过来的名称联合DataSourceUtil进行指定使用哪个数据源

@Slf4j
public class DynamicDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        log.info("动态数据源获取--{}", DataSourceUtil.getDB());
        return DataSourceUtil.getDB();
    }
}

public class DataSourceUtil {
    private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();

    public static void setDB(String dbType){
        contextHolder.set(dbType);
    }
    public static String getDB(){
      return  contextHolder.get();
    }
    public static void clearDB(){
        contextHolder.remove();
    }
}

最后的 这里定义一个事务管理器PlatformTransactionManager 通过

@Qualifier注解将切换数据源的配置类进行注入

然后是调用 DataSourceUtil

DataSourceUtil 类是基于 ThreadLocal 实现的,用于动态管理数据源的标识,整体代码简洁且符合常见的动态数据源切换需求,使用 ThreadLocal 实现线程上下文绑定,用于存储和管理当前线程的数据源标识,setDB就是写入设置绑定数据源标识,这里的名字必须和配置文件的名字对应上基本就可以实现切换数据原了

这里是配置文件的写法注意缩写和依赖包导入这里我就不多赘述了

spring:
  datasource:
    db1:
      driver-class-name: dm.jdbc.driver.DmDriver
      jdbc-url: jdbc:dm://123456789:5524/CCS_HB
      username: CCS
      password: CCS.
    db2:
      enabled: true
      driver-class-name: oracle.jdbc.OracleDriver
      jdbc-url: jdbc:oracle:thin:@//123456789:1521/hbfspdb
      username: user
      password: user

http://www.kler.cn/a/459089.html

相关文章:

  • 力扣hot100——贪心
  • Java 数据库连接 - Sqlite
  • Spring Cloud Security集成JWT 快速入门Demo
  • 解决 ffmpeg “Unknown encoder ‘hevc_nvenc‘“
  • 蓝桥杯JAVA--003
  • 56.在 Vue 3 中使用 OpenLayers 通过 moveend 事件获取地图左上和右下的坐标信息
  • Day10补代码随想录 理论基础|232.用栈实现队列|225.用队列实现栈|20.有效的括号|1047.删除字符串中的所有相邻重复项
  • 工业串行总线中的“安全守护者”,隔离接口芯片
  • 「Mac畅玩鸿蒙与硬件49」UI互动应用篇26 - 数字填色游戏
  • Mysql数据库Redo日志和Undo日志的理解
  • wx011基于springboot+vue+uniapp的机电公司管理信息系统
  • FFmpeg 中 examples 使用教程
  • 软件需求分析期末知识点整理
  • 开启家具组装新方式:产品说明书智能指导
  • CSS系列(36)-- Containment详解
  • Odoo17 4模型安全访问控制:深入理解 model_id:id 和 group_id:id
  • LabVIEW 中 NI Vision 模块的IMAQ Create VI
  • [Excel] CONCATENATE TEXT
  • 实际部署Dify可能遇到的问题:忘记密码、开启HTTPS、知识库文档上传的大小限制和数量限制
  • 【Golang 面试题】每日 3 题(十一)
  • 爬虫基础之爬取 某漫画网站
  • 前端Python应用指南(七)使用SQLAlchemy与Django ORM:数据库操作的Python实践
  • 大数据-264 实时数仓 - Canal MySQL的binlog研究 存储目录 变动信息 配置MySQL
  • 论文笔记PhotoReg: Photometrically Registering 3D Gaussian Splatting Models
  • 【Unity功能集】TextureShop纹理工坊(七)魔棒工具
  • 深入浅出:从入门到精通大模型Prompt、SFT、RAG、Infer、Deploy、Agent