Spring基于aop多数据源切换

笔者之前论述过《 spring 数据源-AbstractRoutingDataSource 》
基于这个,我们只要保证,每次切换数据源,改变lookupkey就好了,具体思路就是创建一个AbstractRoutingDataSource

的子类,实现抽象方法determineCurrentLookupKey,每次修改数据源,就是让determineCurrentLookupKey返回不同的lookupkey就好了。

Spring基于aop多数据源切换_第1张图片

aop拦截service服务里头的方法,切换数据源。通常,我们平常都是通过业务来对库表进行分库,那么service就可以根据业务来划分目录,不同目录下的service服务方法,aop拦截切入点,可以根据目录来设定不同的数据源。

下面附上代码:

DynamicDataSource.java(实现determineCurrentLookupKey方法)

package com.wlt.core.common.dynamicdb;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class DynamicDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        return DbContextHolder.getDbType();
    }
}

DBTypeEnum(枚举所有数据源的key)

package com.wlt.core.common.dynamicdb;

public enum DBTypeEnum {
    /**
     * 测试库
     */
    TEST("test");
    private String value;

    DBTypeEnum(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}
DbContextHolder(当前线程数据源持有对象)
package com.wlt.core.common.dynamicdb;

public class DbContextHolder {
    private static final ThreadLocal contextHolder = new ThreadLocal();
    /**
     * 设置数据源
     * @param dbTypeEnum
     */
    public static void setDbType(DBTypeEnum dbTypeEnum) {
        contextHolder.set(dbTypeEnum.getValue());
    }
    /**
     * 取得当前数据源
     * @return
     */
    public static String getDbType() {
        return contextHolder.get();
    }

    /**
     * 清除上下文数据
     */
    public static void clearDbType() {
        contextHolder.remove();
    }
}

DataSourceInterceptor(基于aop的数据源切换)

package com.wlt.core.common.dynamicdb;

import org.aspectj.lang.JoinPoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class DataSourceInterceptor {

    private static final Logger logger = LoggerFactory.getLogger(DataSourceInterceptor.class);

    public void setTest() {
        DbContextHolder.setDbType(DBTypeEnum.TEST);
    }

    public void setDb(JoinPoint jp) {
        String packageName = jp.getTarget().getClass().getPackage().getName();
        if (packageName.contains(".test.")) {
            DbContextHolder.setDbType(DBTypeEnum.TEST);
        }else {
            //设置默认数据源
            DbContextHolder.setDbType(DBTypeEnum.TEST);
        }
        logger.debug("当前数据源:"+DbContextHolder.getDbType());
    }
}

xml配置

maven依赖包配置:

  
    1.1.8
  
    
      com.alibaba
      druid
      ${druid.version}
    

xml配置:



    
    

    
    
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
    

    
        
        
            
                
                
                
                
            
        
    

    
    
        
        
        
        
        
        
            
                
                
                    
                    
                
            
        
        
        
    
    
        
        
    
    
    
        
        
    

    
    
        
    

    
    

    
    
    
        
            
            
        
        
            
            
        
    


下一篇:spring之jndi数据源配置

你可能感兴趣的:(spring)