解决spring mvc 多数据源切换,不支持事务控制的问题

网友投稿 352 2023-03-28


解决spring mvc 多数据源切换,不支持事务控制的问题

一个项目中需要使用两个数据库,Oracle 和mysql,于是参考各个blog,实现此功能。写好后才发现,原来的事务失效了,我去...

spring-mybatis.xml 配置

classpath:spring/db.properties

init-method="init" destroy-method="close">

init-method="init" destroy-method="close">

clashttp://s="org.springframework.jdbc.datasource.DataSourceTransactionManager">

clashttp://s="org.springframework.jdbc.datasource.DataSourceTransactionManager">

注解切换,默认使用oracle数据源

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target({ElementType.METHOD,ElementType.TYPE})

public @interface DataSource {

String name() default DataSource.oracleDataSource;

String mySqlDataSource = "mySqlDataSource";

String oracleDataSource = "oracleDataSource";

}

注解方式实现切换数据源,搜索注释,更换注释上面的数据源,支持类注释和方法注释

/**

* Created by eastday on 2017/9/21.

*/

public class DataSourceAspect implements MethodBeforeAdvice,AfterReturningAdvice

{

@Override

public void afterReturning(Object returnValue, Method method,

Object[] args, Object target) throws Throwable {

MultipleDataSource.clearDataSource();

}

@Override

public void before(Method method, Object[] args, Object target)

throws Throwable {

//首先取类上的数据源

if(method.getDeclaringClass().isAnnotationPresent(DataSource.class) && !method.isAnnotationPresent(DataSource.class)) {

DataSource datasource = method.getDeclaringClass().getAnnotation(DataSource.class);

MultipleDataSource.setDataSource(datasource.name());

//方法上的数据源 优先级高于类上的

} else if (method.isAnnotationPresent(DataSource.class)) {

DataSource datasource = method.getAnnotation(DataSource.class);

MultipleDataSource.setDataSource(datasource.name());

}

else

{

MultipleDataSource.setDataSource(DataSource.oracleDataSource);

}

}

}

继承AbstractRoutingDataSource实现数据源切换

public class MultipleDataSource extends AbstractRoutingDataSource {

private static final ThreadLocal dataSources = new InheritableThreadLocal();

public static void setDataSource(String dataSource) {

dataSources.set(dataSource);

}

//清除数据源

public static void clearDataSource() {

dataSources.remove();

}

@Override

protected Object determineCurrentLookupKey() {

return dataSources.get();

}

}

使用demo

@DataSource(name = DataSource.mySqlDataSource)

public class ContentServiceImpl implements IContentService {

@Autowired

private IContentDao contentDao;

@Override

public Content queryOne(String type) {

return contentDao.queryOne(type);

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:es6中的解构赋值、扩展运算符和rest参数使用详解
下一篇:接口测试用例覆盖度(接口测试用例设计案例)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~