美文网首页
MyBatisPlus多数据源@DS注解失效问题处理

MyBatisPlus多数据源@DS注解失效问题处理

作者: 王月亮17 | 来源:发表于2024-06-03 09:19 被阅读0次

    ServiceImpl上面加了@DS注解,指明了该Service使用哪个库(比如叫schema_business)。正常使用没有问题。
    有一次在一个使用主库对应Service的方法中调用了这个Service,就报了错,错误内容主要是说表不存在,其实是库错了,大致如下:

    Table ‘schema_master.business_table‘ doesn‘t exist
    

    因为business_table这个表不在schema_master中,而在schema_business中。
    这时候有两种解决方法:

    1. 在实体类上的@TableName注解中加入schema,两种写法如下:
    # 写法一
    @TableName("schema_business.business_table")
    # 写法二
    @TableName(value="business_table", schema="schema_business")
    

    然而这种写法存在一个问题,就是不同环境库名可能不同,到时候要么把库名改一致,要么改代码,比较麻烦。

    1. 而究其根源,这个问题的主要原因在于主库对应Service的方法中加了事务@Transactional,而默认传递机制为REQUIRED,导致被调用的Service加入了该事务,从而与调用方使用了相同的库。
      解决方法就是在被调用的方法上把事务传递机制修改一下。比如改为REQUERES_NEW,该传递机制会暂时将前面的事务挂起,开启新的事务。附上写法:
    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
    

    相关文章

      网友评论

          本文标题:MyBatisPlus多数据源@DS注解失效问题处理

          本文链接:https://www.haomeiwen.com/subject/rvfeqjtx.html