Flask接口签名sign原理与实例代码浅析
352
2023-03-28
解决spring mvc 多数据源切换,不支持事务控制的问题
一个项目中需要使用两个数据库,Oracle 和mysql,于是参考各个blog,实现此功能。写好后才发现,原来的事务失效了,我去...
spring-mybatis.xml 配置
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
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~