Java程序员干货学习笔记春天结合MyBatis实现数据库读写分离

  

   Java程序员干货学习笔记春天结合MyBatis实现数据库读写分离   

  

  随着系统用户访问量的不断增加,数据库的频繁访问将成为我们系统的一大瓶颈之一。由于项目前期用户量不大,我们实现单一的数据库就能完成。但是后期单一的数据库根本无法支撑庞大的项目去访问数据库,那么如何解决这个问题呢?   

  

  实际的应用中,数据库都是读多写少(读取数据的频率高,更新数据的频率相对较少),而读取数据通常耗时比较长,占用数据库服务器的CPU较多,从而影响用户体验。我们通常的做法就是把查询从主库中抽取出来,采用多个从库,使用负载均衡,减轻每个从库的查询压力。   

  

  采用读写分离技术的目标:有效减轻主库的压力,又可以把用户查询数据的请求分发到不同的奴隶库,从而保证系统的健壮性。我们看下采用读写分离的背景。   

  

  我们在项目开发初期的时候就设计了一个简单的读写分离,现在我把演示分享给大家。   

  
  春天采用技术+ mybatis   
  

     

  

  进口java.lang.annotation.ElementType;   

  

  进口java.lang.annotation.Target;   

  

  进口java.lang.annotation.Retention;   

  

  进口java.lang.annotation.RetentionPolicy;   

  

  @Retention (RetentionPolicy.RUNTIME)   

  

  @Target (ElementType.METHOD)   

  

  @ interface公共数据源{   

  

  公共字符串值();   

  

  }   

  

     

  

  公开课HandleDataSource {   

  

  公共静态最终ThreadLocal持有人=new ThreadLocal ();   

  

  公共静态孔隙putDataSource(字符串数据源){   

  

  holder.set(数据源);   

  

  }   

  

  公共静态字符串getDataSource () {   

  

  返回holder.get ();   

  

  }   

  

  }   

  

     

  

  进口java.lang.reflect.Method;   

  

  进口org.aspectj.lang.JoinPoint;   

  

  进口org.aspectj.lang.reflect.MethodSignature;   

  

  公开课DataSourceAspect {   

  

  公共空间切入点(){   

  

  };   

  

  公共空间(点)的连接点{之前   

  

  对象目标=point.getTarget();//拦截的实体类   

  

  字符串方法=point.getSignature () . getname();//拦截的方法名称   

  

  类[]classz=target.getClass () .getInterfaces ();   

  

  类[]parameterTypes=((MethodSignature) point.getSignature ()) .getMethod () .getParameterTypes();//拦截的方法参数类型   

  

  尝试{   

  

  方法m=classz [0]。getMethod(方法、parameterTypes);   

  

  如果(m !=零,,m.isAnnotationPresent (DataSource.class)) {   

  

  数据源数据=https://www.yisu.com/zixun/m.getAnnotation (DataSource.class);   

  

  HandleDataSource.putDataSource (data.value ());   

  

  }   

  

  }捕捉(异常e) {   

  

  e.printStackTrace ();   

  

  }   

  

  }   

  

  }   

  

     

  

  进口org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;   

  

  公开课ChooseDataSource延伸AbstractRoutingDataSource {   

  

  保护对象determineCurrentLookupKey () {   

  

  返回HandleDataSource.getDataSource ();   

  

  }   

  

  }   

  

     

  

  classpath *: mysql.propertiescom.mysql.jdbc.Driver $ {jdbc.url} $ {jdbc.user} $ {jdbc。密码}从DUAL32510010000true60com.mysql.jdbc.Driver选择1 $ {jdbc.url.read} {jdbc.user.read} {jdbc.password美元。阅读}从DUAL32510010000true60选择1   

  

     

  

   Java程序员干货学习笔记春天结合MyBatis实现数据库读写分离   

  

Java程序员干货学习笔记春天结合MyBatis实现数据库读写分离