不多BB,直接上代码:

public class DataSourceKey {

    /**
* 用户数据源
*/
public final static String USER = "userDataSource"; /**
* 报表数据源
*/
public final static String REPORT = "reportDataSource"; /**
* 所有数据源的集合
*/
final static List<String> SOURCES = ImmutableList.of(USER, REPORT); /**
* 根据包名找到数据源, 多数据源的前缀不能存在相同的。 例: user -> userDataSource
*
* @param pack 包名
* @return 数据源名
*/
public static String getDataSourceKey(String pack) {
return SOURCES.stream().filter(s -> s.startsWith(pack)).findFirst().orElse(USER);
}
}
@Component
@Aspect
@Order(-1)
@Slf4j
public class DynamicDataSourceAspect { @Pointcut("execution(* com.in.g.data.mapper..*.*(..))")
public void dataSourcePointcut() {
} @Before("dataSourcePointcut()")
public void doBefore(JoinPoint point) throws Throwable {
log.debug("切换数据源开始。。。。。。。。。。。。");
Package pack = point.getSignature().getDeclaringType().getPackage();
String str = StringUtils.substringAfterLast(pack.getName(), ".");
String dataSourceKey = DataSourceKey.getDataSourceKey(str);
DynamicDataSourceHolder.set(dataSourceKey);
log.debug("切换数据源成功,当前数据源:{}", dataSourceKey);
} @After("dataSourcePointcut()")
public void doAfterReturning() throws Throwable {
DynamicDataSourceHolder.clear();
} }
/**
* 动态数据源持有者
*/
public class DynamicDataSourceHolder { public static ThreadLocal<String> keyHolder = new ThreadLocal<>(); public static void clear() {
keyHolder.remove();
} public static void set(String key) {
keyHolder.set(key);
} public static String get() {
return keyHolder.get();
} }
/**
* 动态数据源配置
*/
public class DynamicRoutingDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DynamicDataSourceHolder.get();
}
}
//正确的代码   --这里偷懒了,直接controller调用dao层

@GetMapping("/testdb")
public String testDateSources(){
     //缩小事务的范围
add();
rptFieldMapper.selectxxxx(); return "sss";
} @Transactional(rollbackFor = Exception.class)
public void add() {
     userMapper.insertXXXX(xxxx);
 }
    //错误的代码,@Transactional注解会导致 数据源切换失败
@GetMapping("/testdb")
@Transactional(rollbackFor = Exception.class)
public String testDateSources(){ userMapper.insertXXXX(xxxx); rptFieldMapper.selectXXXX(); return "sss";
}

最新文章

  1. React Native at first sight
  2. Kinect v2.0 for windows开发环境说明
  3. c++整型-&gt;字符型转换
  4. 四位数码管SH5461AS的问题,arduino学习实测.
  5. HDU 4923
  6. cocos2d-x 添加 libLocalStorage 库...
  7. C#中窗体的一些简单运用
  8. STARTUP.A51详解及如何使能可重入函数
  9. WebUploader IE9下报错
  10. Scriptcase在线试用开发环境
  11. PS 滤镜算法原理——曝光过度
  12. BZOJ_1029_ [JSOI2007]建筑抢修_贪心+堆
  13. foreach(Element elem in selections.Elements)无法实现
  14. Airflow Comman Line 测试
  15. .Net Core Web/Console 下使用Nlog
  16. 软件测试:2.Two Faulty Programs
  17. 在oracle中如何把前台传过来的日期字符串转换成正确格式
  18. Entity Framework教程翻译 ---- 系列教程
  19. windows shell命令相关
  20. 162. Find Peak Element (Array; Divide-and-Conquer)

热门文章

  1. 干货!!!测试如何确定是前端bug还是后端bug
  2. 剑指 Offer 19. 正则表达式匹配 + 动态规划
  3. 人脸识别分析小Demo
  4. ElasticSearch(ES)使用Nested结构存储KV及聚合查询
  5. 痞子衡嵌入式:盘点国内车规级MCU厂商
  6. 商品购买 &amp; 收银台订单优化测试点疑问归纳梳理
  7. [SNOI2019] 通信
  8. python基础学习之文件的基础操作方法
  9. git分支管理--rebase&amp;merge详解
  10. get和post的区别主要有以下几方面