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。




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

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

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

springboot读写分离,多个读库,Druid监控
  • u011493599
  • u011493599
  • 2016年12月29日 17:28
  • 6070

springboot+mybatis(读写分离)

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

springboot环境下实现读写分离

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

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

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

SpringBoot 读写分离实现(AbstractRoutingDataSource)

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

springboot +jpa 读写分离 遇到JavassistLazyInitializer及解决

最近做一个实验,用到springboot +jpa 用来操作mysql 读写分离,遇到一个问题,我在  使用dao 对象 public interface PersonRepository ext...
  • flyskyhunter
  • flyskyhunter
  • 2017年04月30日 00:46
  • 1089

springboot+jedis+读写分离+哨兵模式+集群高可用

springboot+jedis+读写分离+哨兵模式+集群高可用 有demo下载 准备软件: 1.  Redis-x64-3.0.502.zip 2.  rubyinstaller-2.4.2-2-x...
  • Towin_hong
  • Towin_hong
  • 2017年12月18日 22:23
  • 267

Spring Boot,Spring Data JPA多数据源支持配置

1.配置文件 #mysql #主库参数primary spring.primary.datasource.url=jdbc:mysql://101.200.152.192:3307/ovuola...
  • u013059432
  • u013059432
  • 2017年09月22日 17:09
  • 260

spring-data-jpa连接mycat实现应用的读写分离

接 主从复制 读写分离 本文介绍使用spring-data-jpa连接mycat实现应用的读写分离.原文地址:spring-data-jpa连接mycat实现应用的读写分离系统环境 sp...
  • qq457557442
  • qq457557442
  • 2017年01月05日 12:12
  • 4552
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:springboot读写分离开关控制
举报原因:
原因补充:

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