springboot结合mysql主从来实现读写分离的方法

  

这篇文章主要介绍springboot结合mysql主从来实现读写分离的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

1。实现的功能

,,,基于springboot框架,application.yml配置多个数据源,使用AOP以及AbstractRootingDataSource, ThreadLocal来实现多数据源切换,以实现读写分离.mysql的主从数据库需要进行设置数据之间的同步。

2。代码实现

,,,应用程序。属性中的配置

spring.datasource.druid.master.driver-class-name=com.mysql.jdbc.Driver   spring.datasource.druid.master.url=jdbc: mysql://127.0.0.1:3306/node2 ? useUnicode=true& characterEncoding=UTF-8& allowMultiQueries=true& autoReconnect=true& useSSL=false   spring.datasource.druid.master.username=根   spring.datasource.druid.master.password=123456   ,   ,   spring.datasource.druid.slave.driver-class-name=com.mysql.jdbc.Driver   spring.datasource.druid.slave.url=jdbc: mysql://127.0.0.1:3306/node1 ? useUnicode=true& characterEncoding=UTF-8& allowMultiQueries=true& autoReconnect=true& useSSL=false   spring.datasource.druid.slave.username=根   spring.datasource.druid.slave.password=123456

写一个DataSourceConfig。java来注入两个bean

, @ bean   ,,,@ConfigurationProperties (“spring.datasource.druid.master")   ,,,public  DataSource  masterDataSource (), {   ,,,,,,,logger.info (“select  master  data  source");   ,,,,,,,return  DruidDataSourceBuilder.create () .build ();   ,,,}   ,   ,,@ bean   ,,,@ConfigurationProperties (“spring.datasource.druid.slave")   ,,,public  DataSource  slaveDataSource (), {   ,,,,,,,logger.info (“select  slave  data  source");   ,,,,,,,return  DruidDataSourceBuilder.create () .build ();   ,,,}

写一个枚举来标识有哪些数据源

public  enum  DBTypeEnum  {   ,,,,,的奴隶;   }

然后写一个ThreadLocal本地线程的管理类,用于设置当前线程是那一个数据源

private  static  final  ThreadLocal, contextHolder =, new  ThreadLocal<在();   ,   ,,,private  static  final  ThreadLocal, contextHolder2 =, ThreadLocal.withInitial ((),→, DBTypeEnum.MASTER);   ,   ,,,public  static  void 设置(DBTypeEnum  dbType), {   ,,,,,,,contextHolder.set (dbType);   ,,,}   ,   ,,,public  static  DBTypeEnum 得到(),{   ,,,,,,,return  contextHolder.get ();   ,,,}   ,   ,,,public  static  void 主(),{   ,,,,,,,设置(DBTypeEnum.MASTER);   ,,,,,,,logger.info(“切换到主数据源“);   ,,,}   ,   ,,,public  static  void 奴隶(),{   ,,,,,,,设置(DBTypeEnum.SLAVE);   ,,,,,,,logger.info(“切换到奴隶数据源“);   ,,,}   ,   ,,,public  static  void  cleanAll (), {   ,,,,,,,contextHolder.remove ();   ,,,}

然后写一个DynamicDataSource继承AbstractRootingDataSource,重写它的determineCurrentLookupKey方法。

public  class  DynamicDataSource  extends  AbstractRoutingDataSource  {   ,,,private  Logger  Logger =, LogManager.getLogger (DynamicDataSource.class);   ,   ,,@Override   ,,,protected  Object  determineCurrentLookupKey (), {   ,,,,,,,logger.info(“此时数据源为{},,,DBContextHolder.get ());   ,,,,,,,return  DBContextHolder.get ();   ,,,}   }

最后写一个AOP来实现数据源切换

@Aspect   @Order (1)   @ component   public  class  DataSourceAop  {   ,   ,,,private  Logger  Logger =, LogManager.getLogger (DataSourceAop.class);   ,   ,,,@Pointcut(“(执行(*,com.springboot.demo.service . . * .select * (. .)),“, +   ,,,,,,,,,,,“| |,执行(*,com.springboot.demo.service . . * * (. .)),“+   ,,,,,,,,,,,“| |,执行(*,com.springboot.demo.service . . * . get * (. .)))“)   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

springboot结合mysql主从来实现读写分离的方法