频道栏目
首页 > 网络 > 云计算 > 正文
利用Spring的AbstractRoutingDataSource来解决多数据源的问题,eg:数据库的读写分离
2017-06-29 10:12:00         来源:java小兵  
收藏   我要投稿
利用Spring的AbstractRoutingDataSource来解决多数据源的问题,eg:数据库的读写分离

步骤:
	1)在配置文件中定义多个datasource。
	2)自定义一个DBContext类,并在其中封装一个静态的ThreadLocal变量(用来存储当前线程应该访问哪个数据库),并实现访问静态ThreadLocal变量的静态方法(设值和取值)。
	3)自定义一个继承了AbstractRoutingDataSource的类DynamicDataSource,并实现父类的determineCurrentLookupKey()方法,该方法从DBContext获取到当前线程应该访问哪个数据库并返回。
	4)在调用dao前,使用切面将dao应该访问的数据库放到DBContext类的dbContext变量中。

	这样,当调用dao时,动态数据源DynamicDataSource就会根据DBContext类的dbContext变量来确定应该使用哪个数据库了。

例子:



	数据源配置
	
	
			
		mysql.jdbc.Driver">
		
		
		
		
	
	
	
			
		
		
		
		
		
	
	
	
			
		
		
		
		
		
	
	
	
			
		
		
		
		
		
	
	

		
	
		
				
				
				
				
			
		
		
	

	
	
	
	
	
		aspect id="dataSourceAspect" ref="dataSourceInterceptor">
			
	
	
	
	
	
		
	
	
	 
	
	
	
	
		
		
	

	
	
	
		
		
	
	


	
自定义的动态数据源DynamicDataSource、自定义的数据库上下文类DBContext、自定义的切面类DataSourceInterceptor:
	
	/**  
     * 动态数据源:根据determineCurrentLookupKey()方法的返回值来确定访问的是哪个数据库
     */  
	import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
	
	public class DynamicDataSource extends AbstractRoutingDataSource {

		@Override
		protected Object determineCurrentLookupKey() {
			return DBContext.getDbContext();
		}

	}


	/**  
     * 通过ThreadLocal模式,提供一个共享环境,存储每个线程将要访问的数据库
     */ 
	public class DBContext {
		private static final ThreadLocal dbContext = new ThreadLocal();

		public static void setDbContext(String dbContextType) {
			dbContext.set(dbContextType);
		}

		public static String getDbContext() {
			return dbContext.get();
		}

		public static void clearDbContext() {
			dbContext.remove();
		}
	}
	
	
	/**  
     * 切面类:在调用DAO方法前,把线程将要访问的数据库存储在共享变量DBContext.dbContext中
     */ 
	public class DataSourceInterceptor {

		public void setDataSourceAdvertise(JoinPoint jp) {
			DBContext.setDbContext("dataSource_advertise");
		}
		
		public void setDataSourceAdvertiseRead(JoinPoint jp) {
			DBContext.setDbContext("dataSource_advertise_read");
		}
		
		public void setDataSourceAdvertiseBaidu(JoinPoint jp) {
			DBContext.setDbContext("dataSource_advertise_baidu");
		}
		
		public void setDataSourceAdvertiseSogou(JoinPoint jp) {
			DBContext.setDbContext("dataSource_advertise_sogou");
		}

	}
		

点击复制链接 与好友分享!回本站首页
上一篇:社区发现评估指标-NMI
下一篇:理解容器之间的连通性-每天5分钟玩转Docker容器技术(34)
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站