zoukankan      html  css  js  c++  java
  • Spring MyBatis多数据源(同包)

    分包的同学点这里:Spring MyBatis多数据源(包)


    创建基本的包entity service dao 为了区分多数据源 一个用的是Mysql 一个是Oracle 方便测试,


    创建MyBatis dao 映射 xml 文件


    创建db.properties

    我这里设置了2个数据源

    创建Mybatis.xml 文件

    建议创建2个,也可以创建一个.但是2个 耦合性降低


    还需要用到工具类:

    package com.cp.util.datasources;
    
    import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
    
    /**
     * 动态切换数据库
     * 
     * @author Joey
     * @project:SSM_MultiDataSource_CP
     * @date:2017年4月27日
     * 
     */
    public class DynamicDataSource extends AbstractRoutingDataSource {
    
    	@Override
    	protected Object determineCurrentLookupKey() {
    		return DataSourceContextHolder.getDbType();
    	}
    
    }

    package com.cp.util.datasources;
    
    /**
     * 数据库切换的工具类
     * 
     * @author Joey
     * @project:SSM_MultiDataSource_CP
     * @date:2017年4月27日
     * 
     */
    public class DataSourceContextHolder {
    
    	public static final String DATA_SOURCE_A = "dataSource1";
    	public static final String DATA_SOURCE_B = "dataSource2";
    
    	/** 数据源类型 */
    	private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
    
    	/**
    	 * 设置数据源类型
    	 * 
    	 * @param dbType
    	 *            数据源类型
    	 */
    	public static void setDbType(String dbType) {
    		contextHolder.set(dbType);
    	}
    
    	/**
    	 * 获取数据源类型
    	 * 
    	 * @return String
    	 */
    	public static String getDbType() {
    		return ((String) contextHolder.get());
    	}
    
    	/**
    	 * 清除数据源类型
    	 */
    	public static void clearDbType() {
    		contextHolder.remove();
    	}
    
    }
    


    package com.cp.util.datasources;
    
    import java.lang.reflect.Method;
    
    import org.springframework.aop.AfterReturningAdvice;
    import org.springframework.aop.MethodBeforeAdvice;
    
    /**
     * 数据源前置增强
     * 
     * @author Joey
     * @project:SSM_MultiDataSource_CP
     * @date:2017年4月28日
     * 
     */
    public class DataSourceAspect implements MethodBeforeAdvice,
    		AfterReturningAdvice {
    
    	@Override
    	public void afterReturning(Object returnValue, Method method,
    			Object[] args, Object target) throws Throwable {
    		DataSourceContextHolder.clearDbType();
    	}
    
    	@Override
    	public void before(Method method, Object[] args, Object target)
    			throws Throwable {
    		if (method.isAnnotationPresent(DataSource.class)) {
    			DataSource datasource = method.getAnnotation(DataSource.class);
    			DataSourceContextHolder.setDbType(datasource.value());
    		} else {
    			DataSourceContextHolder
    					.setDbType(DataSourceContextHolder.DATA_SOURCE_A);
    		}
    
    	}
    }

    package com.cp.util.datasources;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    /**
     * 动态数据源(default:DataSourceContextHolder.DATA_SOURCE_A)
     * 
     * @author Joey
     * @project:SSM_MultiDataSource_CP
     * @date:2017年4月28日
     * 
     */
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    @Documented
    public @interface DataSource {
    
    	String value() default DataSourceContextHolder.DATA_SOURCE_A;
    
    }


    Spring配置文件 :

    配置扫描包.

    导入数据源连接信息


    设置2个数据源


    使用的是Druid 个人觉得不错。推荐一下


    Druid的日志记录Filter



    DynamicDataSource类是你刚刚自定义的工具类,上面有

    导入2个数据源,默认数据源是DataSource1

    事物管理 和 开启事物自动扫描注解

    加上前置增强 DataSourceAspect类也是你刚刚自定义的工具类,上面有


    最重要的一步: 开启AOP注解支持

    方法注解使用多数据源


    在service里的方法要使用不同的数据源

    方法直接注解:
    @DataSource(DataSourceContextHolder.DATA_SOURCE_B)


    默认的使用是A 可以自己配置

    注意: DataSourceContextHolder类里的DATA_SOURCE_A 和 DATA_SOURCE_B 的值要和spring配置文件对应

    可以自己去试试


    附上楼主的源码

    亲,点我去下载

    chuagn 创建

  • 相关阅读:
    web中间件之nginx
    JVM之工具分析
    jprofiler监控tomcat
    如何查看端口被占用
    训练赛第二场C题 zoj 2339 Hyperhuffman
    训练赛第三场A题 zoj 559
    训练赛第二场G题 ZOJ 2343
    训练赛第一场D题
    训练赛第一场A题 (ZOJ 2313)
    HDU 1422 重温世界杯 DP题
  • 原文地址:https://www.cnblogs.com/zhousiwei/p/10625794.html
Copyright © 2011-2022 走看看