mybatisplus多数据源问题

mybatisplus多数据源配置

链接: mybatisplus官网.
多数据源特性:
支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。
支持数据库敏感配置信息 加密 ENC()。
支持每个数据库独立初始化表结构schema和数据库database。
支持 自定义注解 ,需继承DS(3.2.0+)。
提供对Druid,Mybatis-Plus,P6sy,Jndi的快速集成。
简化Druid和HikariCp配置,提供 全局参数配置 。配置一次,全局通用。
提供 自定义数据源来源 方案。
提供项目启动后 动态增加移除数据源 方案。
提供Mybatis环境下的 纯读写分离 方案。
提供使用 spel动态参数 解析数据源方案。内置spel,session,header,支持自定义。
支持 多层数据源嵌套切换 。(ServiceA >>> ServiceB >>> ServiceC)。
提供对shiro,sharding-jdbc,quartz等第三方库集成的方案,注意事项和示例。
提供 基于seata的分布式事务方案附:不支持原生spring事务。

基本的配置根据官网一步一步来即可

注意点
spring:
    datasource:
        type: com.zaxxer.hikari.HikariDataSource
        dynamic:
            primary: system #设置默认的数据源或者数据源组
            strict: false #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候会抛出异常,不启动则使用默认数据源.
            datasource:
                database1:
                    url: jdbc:mysql://localhost:3306/system?useUnicode=true&characterEncoding=UTF-8&useSSL=false
                    username: username
                    password: password
                    driver-class-name:  com.mysql.cj.jdbc.Driver
                    #连接池可以在每个数据源下面单独配置,也可抽出成公共配置
                    hikari:
                        maximum-pool-size: 100
                        minimum-idle: 20
                        data-source-properties:
                            cachePrepStmts: true
                            prepStmtCacheSize: 250
                            prepStmtCacheSqlLimit: 2048
                            useServerPrepStmts: true
            	  database2:
            	  ........
疑似坑点:碰到了多数据源依赖在mybatisplus核心依赖之后,多数据源依赖无法引入的问题(可能是个人环境问题)。

重要:mybatisplus官方并没有提供事务的实现

引入mybatisplus的多数据源配置后,无法使用spring的原生事务,强行使用@Transactional注解后会出现默认使用第一个数据源作为连接,此时,如果是查询非默认数据源数据,会报表不存在的异常。
网上的多数据源事务配置比较繁琐,这里实验了一种比较简单的多数据源事务配置
注:只支持单个数据源事务,多数据源之间的事务不支持

原因:使用@DS注解动态切换数据源之后spring自带事务并不知道有哪些数据源,那么解决也就从这里开始
第一步
//注入数据源给jta事务管理器,在使用spring原生事务注解时,指定事务管理器TransactionManager,由jta对多数据源进行管理(这里未尝试其他事务管理器,感兴趣的可以尝试一下)
    @Bean(name = "TransactionManager")
    @Primary
    @Order(2)
    public DataSourceTransactionManager TransactionManager(@Qualifier("dataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
第二步
//在service层的方法上注解相应的事务和@DS
//这里有一个坑,如果@Transactional注解在service层,@DS注解到mapper上是不会起作用的,二者必须同时注解在service方法上,所以,在mapper上也要加,service的事务方法也要加,这样其他不需要事务的方法不会报错,事务方法也会生效。
    @Transactional(transactionManager = "TransactionManager")
    @DS("chddata")
    public void serviceMethod(){
    }
注:正如官网所说:强烈建议只在service的类和方法上添加注解,不建议在mapper上添加注解。
MybatisPlus中切换数据源可以通过使用DynamicDataSourceContextHolder类来实现。这个类是一个基于ThreadLocal的切换数据源工具类。它使用了一个栈来支持嵌套切换数据源的需求。当需要切换数据源时,可以调用DynamicDataSourceContextHolder的push方法来设置当前线程的数据源。这个方法会将数据源名称压入栈中。在需要获取当前线程数据源的地方,可以调用DynamicDataSourceContextHolder的peek方法来获取栈顶的数据源名称。这样就可以在函数中切换数据源了。\[1\] 另外,如果你使用的是MybatisPlus的多数据源组件(dynamic-datasource-spring-boot-starter),你可以在需要切换数据源的方法上使用@DS注解来指定数据源。这样可以更方便地实现数据源的切换。如果多个数据源有修改操作,你可以在这些方法上都打上事务注解,并改变传播机制。需要注意的是,这种方式不能保证事务的一致性,如果需要分布式事务的支持,可以借助seata,并使用@DSTransactional注解来实现。\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [MybatisPlus多数据源原理与问题简析](https://blog.csdn.net/Q176782/article/details/131371359)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [SpringBoot整合MybatisPlus多数据源](https://blog.csdn.net/qq_37284798/article/details/129279732)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值