本文讲述springboot环境下构造读写分离的框架;
读写分离 有哪些好处呢,相信不用多讲,大家能够花时间看这篇文章,那么就很清楚它的应用场景了,下面我们开始直接进入正题;
读写分离其实就是在底层替换数据源即可,针对一主一从的情况下数据源切换比较简单,那么在一主多从的情况下如何有效的切换数据源则是一件很头疼的事情,简单的算法可以用随机,稍微改进则可以用轮寻,再改进的是不是可以用minCollectsUsed?针对这些情况还是看业务场景决定吧;
目前讲述的是一主一从的情况下
下面是根据一主一从的场景下讲述:
首先要了解什么时候切换,如何切换
在所有的读的时候进行切换,在update,delete,savfe的时候进行切换;如何判断这些呢?若是在集群的环境下我们可以通过路由控制服务的走向,在服务段配置下即可;但是这样移植性比较差;在不污染代码的同时我们可以采用AOP定义切入点来实现;实现方式如下:
@Pointcut("execution(* com.xx.wdcloud.mybatis.dao.impl.BaseDaoImpl.list*(..)) ||execution(* com.xx.wdcloud.mybatis.dao.impl.BaseDaoImpl.count*(..))||execution(* com.xx.wdcloud.mybatis.dao.impl.BaseDaoImpl.pager*(..))")
public void slavePointCut(){}
@Pointcut("execution(* com.xx.wdcloud.mybatis.dao.impl.BaseDaoImpl.save*(..)) || execution(* com.xx.wdcloud.mybatis.dao.impl.BaseDaoImpl.delete*(..))||execution(* com.xx.wdcloud.mybatis.dao.impl.BaseDaoImpl.update*(..))||execution(* com.xx.wdcloud.mybatis.dao.impl.BaseDaoImpl.batchDelete*(..))")
public void masterPointCut(){}
/*@Before("slavePointCut()")
public void setSlaveDataSouce(){
DataSourceContextHolder.read();
}
@Before("masterPointCut()")
public void setMasterDataSource(){
DataSourceContextHolder.write();
}*/
@Around("slavePointCut()