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

2024-06-03  本文已影响0人  王月亮17

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)
上一篇下一篇

猜你喜欢

热点阅读