AtomicReference<String> dsName = new AtomicReference<>();
DataSourceSwitchInvoker.invokeOn(eventName -> {
if (SET_BEFORE.equals(eventName)) {
//执行前,自行记录之前的数据源
dsName.set(dataSourceHolder.get());
//设置新数据源
dataSourceHolder.set("master_db");
} else if (SET_AFTER.equals(eventName)) {
//执行后,还原设置数据源
dataSourceHolder.set(dsName.get());
}
}, () -> {
Object demo = null; //模拟 demoMapper.get(123L);
return demo;
});
}
复制代码
编码建议:
切换虽好用,但建议不要在切换的方法中进行写数据的操作,更得当仅用于临时需要查询其他数据源的数据时使用,以免破坏spring事务的完备性,因为invokeOn方法本身就是先挂起一个事务,然后开新连接实行新的操作DB的方法,最后还原恢复事务,若在其中又进行了其他的操作,大概存在未知风险,固然理论做什么都可以但非常不建议。
经多种测试,无论是普通方法 OR 在事务中的方法,均能正常实行,简直就是YYDS!原创不易,如有资助关注+点个赞吧v