mybatisplus多数据源问题

本文详细介绍了MyBatisPlus多数据源配置的特性与步骤,包括数据源分组、敏感信息加密、独立表结构初始化、注解自定义、动态数据源管理及事务配置。特别关注了在多数据源环境下如何正确使用Spring事务,提供了具体解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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上添加注解。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值