Mybatis-Plus多数据源事务

本文介绍了如何在Mybatis-Plus中处理多数据源切换及解决误读问题,通过JTA进行多数据源事务管理,包括Atomikos的集成和配置。同时讨论了动态schema的实现,利用反射修改@TableName注解属性,并介绍了LanguageDriver接口在解决XML或Mapper.java中硬编码schema的方法。
摘要由CSDN通过智能技术生成

Mybatis-Plus多数据源

        Mybatis-Plus的多数据源切换是通过AOP实现的,我们常用的com.baomidou.dynamic.datasource.annotation.DS就是切换的依据。但这种做法只适用于Service方法里只有一个数据源的情况,如果Service方法里涉及到了多个数据源,就会出现误读的情况。

误读:Service配置的是DS("db1"), 方法1中要读一个db2里的表A,就会提示db1.tableA not exists

        怎么解决呢?我们知道ORM类可以打com.baomidou.mybatisplus.annotation.TableName注解,TableName里有个schema属性。追踪下去,我们看到com.baomidou.mybatisplus.core.metadata.TableInfoHelper#initTableName用到了schema属性,并把表名装饰成schema+"."+tableName的格式。这样就解决了误读的问题啦~

private static String[] initTableName(Class<?> clazz, GlobalConfig globalConfig, TableInfo tableInfo) {
    /* 数据库全局配置 */
    GlobalConfig.DbConfig dbConfig = globalConfig.getDbConfig();
    // 获取ORM类上的TableName注解
    TableName table = clazz.getAnnotation(TableName.class);
    String tableName = clazz.getSimpleName();
    String tablePrefix = dbConfig.getTablePrefix();
    String schema = dbConfig.getSchema();
    ...
    if (table != null) {
        ...
        // 如果TableName注解里的schema不为空,则获取
        if (StringUtils.isNotBlank(table.schema())) {
            schema = table.schema();
        }
        ...
    } else {
        ...
    }
    ...
    // 将schema拼接到tableName前
    if (StringUtils.isNotBlank(schema)) {
        targetTableName = schema + StringPool.DOT + targetTableName;
    }

    tableInfo.setTableName(targetTableName);
    ...
}

        还有一种需要多数据源但DS不给力的情况,就是在代码层面实现读-写分离。这种场景可以通过实现一个org.apache.ibatis.plugin.Interceptor拦截方法来达到目的。

多数据源事务(JTA)

        JTA包括事务管理器(Transaction Manager)和一个或多个支持 XA 协议的资源管理器 ( Resource Manager ) 两部分, 可以将资源管理器看做任意类型的持久化数据存储;事务管理器则承担着所有事务参与单元的协调与控制。

        JTA只是提供了一个接口,并没有提供具体的实现。

        Atomikos对其进行了实现,而后SpringBoot将其进行了整合,对其进行了托管,很方便开发者拿来即用。

        接入步骤:

                1. 根据配置,创建AtomikosDataSourceBean,管理一个XA数据源。多数据源会有多个实例。

                2. 把AtomikosDataSourceBean交给SqlSessionFactory管理。

                3. 配置JTA事务管理。

        我们用的是Mybatis-Plus,所以在第一步,我们需要接管Mybatis-Plus的数据源配置,再在第二步将AtomikosDataSourceBean交托给Mybatis-Plus的SqlSessionFactory管理。

        下面来看看具体的代码实现:

                步骤1:接

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值