springboot读写分离开关控制

原创 2017年07月17日 16:55:52

上文中http://blog.csdn.net/liunian02050328/article/details/75090297 讲述了springboot环境下读写分离的实现方法;

项目搭建的核心是为了给更多的用户去使用,部分情况下是使用读写分离,然后可以直接用这套框架,但是部分项目因业务量比较小,不想使用读写分离的方案呢?修改config?是的,这个方案看起来很不错,那么我们就坑次坑次的修改,修改好之后正常跑起来项目,看起来是一个不错的方案得到实施,过了几天后项目经理说,小X,根据项目的实际需求我们还是需要用到读写分离的方案,但是在本地开发的环境下只有master库,此时再次修改代码貌似不是一个良好的解决方案了;ok,那就看下下面的方案吧,下面的是个人观点及思路:

首先定义参数

readAndwriteKey: false   #true  false的时候代表的是不使用读写分离,true的时候是使用读写分离方案

通过参数配置,实现dev和relase环境的自由切换;

下面看下代码部分的修改;

在设计此方案的时候为第一放映想到的是@condition注解,貌似该注解是springframework4.x后出现的;之前貌似可以用别的方案实现;

采用注解的方式还是很不错的,最少直观易懂;

ok,开始看代码

首先定义个类实现condition方法,如下:

public class MasterCondition implements Condition {

	@Override
	public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
		String key=context.getEnvironment().getProperty("readAndwriteKey");
		boolean flag="false".equals(key)? false:true;
		return flag;
	}

}

其中返回false的时候代表的是引用此处的@condition注解是不不加载到容器中来的;true的话就是相反了。

当为false的时候,在上一篇文章http://blog.csdn.net/liunian02050328/article/details/75090297中定义的路由就没什么用了。那么我们就用@condtion注解一下,如下

       @Conditional(MasterCondition.class)
	@Bean
	public AbstractRoutingDataSource dataSouceProxy() {
		MyAbstractRoutingDataSource proxy = new MyAbstractRoutingDataSource();
		Map<Object, Object> targetDataSource = new HashMap<Object, Object>();
		targetDataSource.put(DataSourceType.slaveDataSource.getDataSource(), slaveDataSource());
		targetDataSource.put(DataSourceType.masterDataSource.getDataSource(), masterDataSource());
		proxy.setTargetDataSources(targetDataSource);
		proxy.setDefaultTargetDataSource(slaveDataSource());
		return proxy;
	}
相同的在上一篇定义的AOP的类上加上相同的注解即可。
此处的路由调度采用了condition注解,启动的时候没有加载到容器中来,在引用路由后获得的datasource时候获取为空,肯定会报异常,这时候需要修改方法sqlSessionFactory

具体修改如下:

@Bean
	public SqlSessionFactory sqlSessionFactory() throws Exception {
		SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
		boolean flag="false".equals(readAndwriteKey);
		
		if (flag) {
			sqlSessionFactoryBean.setDataSource(masterDataSource());
		}else{
			sqlSessionFactoryBean.setDataSource(dataSouceProxy());
		}
		// sqlSessionFactoryBean.setTypeAliasesPackage("com.*.*");
		sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("/config/mybatis-config.xml"));
		PathMatchingResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();

		sqlSessionFactoryBean
				.setMapperLocations(resourcePatternResolver.getResources("classpath*:com/xx/xxx/mapper/*Mapper.xml"));
		return sqlSessionFactoryBean.getObject();
	}

上面的这个是不是可以改进下?我是采用的是if  else  判断,是不是看起来比较low,欢迎高手指正并提出良好的解决方案

当我们根据数据源获得的sqlsessionfactory之后,ok,下面的就不永讲了,相信大家都会使用了。

总结如下:

所谓的读写分离,主要做的就是在数据连接底层切换数据源,如何切换呢?一主一从比较简单,这里的路由没怎么写路由算法,在一主多从的里面会涉及到,在后面的章节中会降到。

而设计读写分离的开关,无非就是屏蔽路由数据源的方法以及aop。




springboot环境下实现读写分离

本文讲述springboot环境下构造读写分离的框架; 读写分离 有哪些好处呢,相信不用多讲,大家能够花时间看这篇文章,那么就很清楚它的应用场景了,下面我们开始直接进入正题; 读写分离其实就是在底...
  • liunian02050328
  • liunian02050328
  • 2017-07-13 19:37:50
  • 3046

springboot多数据源读写分离和主库数据源service层事务控制

读写分离如果撇开框架无非就是实现多个数据源,主库用写的数据源,从库用读的数据源。 因为想研究数据库读写分离和分库分表的设计,所以就自己搭建了一套springboot+druid+mybatis+aop...
  • ggj20ss
  • ggj20ss
  • 2016-05-31 10:57:10
  • 21248

SpringBoot 读写分离实现(AbstractRoutingDataSource)

读写分离一直都是项目的标配,之前项目的做法非常简单,直接配置两个数据源,一个只读,一个只写,只读的放到xxx.read,只写的放到xxx.write包下。Service层调用的时候根据操作选择对应的数...
  • believer123
  • believer123
  • 2017-10-13 13:09:35
  • 1197

springboot(五)读写分离,多个读库,Druid监控

springboot读写分离,多个读库,Druid监控
  • u011493599
  • u011493599
  • 2016-12-29 17:28:16
  • 7143

springboot+mybatis(读写分离)

Springboot+mybatis 整合有两种方式 即注解和配置文件。此demo中使用的是配置文件方式,个人觉得此种方式更便于维护和阅读。此文中只列出目录结构以及每个类的作用,详细代码见githtt...
  • zjlzt1989
  • zjlzt1989
  • 2017-06-12 18:00:40
  • 1020

SpringBoot Mybatis 读写分离配置

https://www.jianshu.com/p/f2f4256a2310为什么需要读写分离当项目越来越大和并发越来大的情况下,单个数据库服务器的压力肯定也是越来越大,最终演变成数据库成为性能的瓶颈...
  • qq_16605855
  • qq_16605855
  • 2018-03-10 11:36:59
  • 33

使用Spring实现读写分离( MySQL实现主从复制)

1.  背景 我们一般应用对数据库而言都是“读多写少”,也就说对数据库读取数据的压力比较大,有一个思路就是说采用数据库集群的方案, 其中一个是主库,负责写入数据,我们称之为:写库; 其它都是从库,负责...
  • jack85986370
  • jack85986370
  • 2016-06-01 21:32:53
  • 31709

spring boot学习7之mybatis+mysql读写分离(一写多读)+事务

当业务的访问量(数据库的查询)非常大时,为了降低数据库的压力,希望有多个数据库进行负载均衡,避免所有的查询都集中在一台数据库,造成数据库压力过大。mysql支持一主多从,即在写库的数据库发生变动时,会...
  • dream_broken
  • dream_broken
  • 2017-06-03 13:07:51
  • 8326

SpringBoot微服务 +tomcat集群+Ngnix负载均衡+Mysql主从复制,读写分离(1)

一:SpringBoot微服务部署  1.有两个maven的SpringBoot项目,一个是是base项目(放一些公共的代码与公共maven配置文件),一个是test(业务逻辑代码),也就是test依...
  • u011687186
  • u011687186
  • 2017-03-15 10:34:03
  • 1466

[免费]<em>Springboot</em>-mybatis<em>读写分离</em>

利用<em>SpringBoot</em>-mybatis实现<em>读写分离</em>。该代码是针对个人的docker <em>读写分离</em>做的测试代码。综合评分:0 收藏评论举报 所需: 0积分/C币 下载个数: 0 开通VIP 立即...
  • 2018年04月13日 00:00
收藏助手
不良信息举报
您举报文章:springboot读写分离开关控制
举报原因:
原因补充:

(最多只允许输入30个字)