spring动态数据源切换

原创
2017/11/09 16:43
阅读数 64

https://my.oschina.net/u/727394/blog/863808 

http://blog.csdn.net/zbw18297786698/article/details/54343188

spring 动态数据源切换 只能在service切换,不能在dao切换

修改事务管理器的数据源为动态数据源,指定事务注解的排序为2,我们会指定切换数据源的注解为1,这样在事务之前切换数据源,否则在事务之后切换的的话,无效。

<!-- 注解事务处理 -->  
<bean id="transactionManager"  
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
<property name="dataSource" ref="dynamicDataSource" />  
<!-- 启用注解 -->  
<tx:annotation-driven transaction-manager="transactionManager" order="2"/>  

定义切换数据库的注解和aop切面,指定排序为1,这里有个疑问,通过切点获取代理方法的注解数据,我用的是反射,但是网上有说可以直接作为参数传入的,我一直没有试验成功,不知道哪里有错,后续哪位大神指导的,可以分享一下。

<!-- 注解事务处理 -->  
<bean id="transactionManager"  
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
<property name="dataSource" ref="dynamicDataSource" />  
<!-- 启用注解 -->  
<tx:annotation-driven transaction-manager="transactionManager" order="2"/>  
@Target({ElementType.METHOD, ElementType.TYPE})  
@Retention(RetentionPolicy.RUNTIME)  
@Inherited  
@Documented  
public @interface DataSource {  
   String name();  
}  
  
@Component  
@Aspect  
@Order(1)  
public class DataSourceProxy {  
  
@Before(value="@annotation(com.futuren.wzk.common.datasource.DataSource)")  
public void before(JoinPoint jp) {  
    String methodName = jp.getSignature().getName();   
    Method[] methods = jp.getTarget().getClass().getMethods();  
    for(Method method : methods) {  
        if(method.getName().equals(methodName)) {  
        DataSource ds = method.getAnnotation(DataSource.class);  
        DataSourceContextHolder.setDataSourceType(ds.name());  
     }  
   }  
 }  
}  

 

 

 

 

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部