使用SpringBoot如何实现一个MySQL读写分离功能

  介绍

本篇文章给大家分享的是有关使用SpringBoot如何实现一个MySQL读写分离功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

<强>主从同步的局限性:

<强>这里涉及到一个问题:主从复制的延迟问题。当写入到主数据库的过程中,突然来了一个读请求,而此时数据还没有完全同步,就会出现读请求的数据读不到或者读出的数据比原始值少的情况,具体的解决方法最简单的就是将读请求暂时指向主库,但是同时也失去了主从分离的部分意义。也就是说在严格意义上的数据一致性场景中,读写分离并非是完全适合的,注意更新的时效性是读写分离使用的缺点。

好了,这部分只是了解,接下来我们看下具体如何通过java代码来实现读写分离:

该项目需要引入如下依赖:SpringBoot, spring aop, spring jdbc, aspectjweaver等。

<强> <强>之处;,,主从数据源的配置,,,- - - - - -

我们需要配置主从数据库,主从数据库的配置一般都是写在配置文件里面。通过@ConfigurationProperties注解,可以将配置文件(一般命名为:application.Properties)里的属性映射到具体的类属性上,从而读取到写入的值注入到具体的代码配置中,按照习惯大于约定的原则,主库我们都是注为大师,从库注为奴隶。

本项目采用了阿里的德鲁伊教团员数据库连接池,使用构建建造者模式创建数据源对象,数据源就是代码层面抽象出来的数据源,接着需要配置sessionFactory, sqlTemplate,事务管理器等:

/* *   ,*主从配置   ,*   ,* @author  wyq   ,*/@ configuration   @MapperScan (=basePackages “com.wyq.mysqlreadwriteseparate.mapper",, sqlSessionTemplateRef =,“sqlTemplate")   public  class  DataSourceConfig  {/* *   *,才能主库   ,*/,@ bean   ,@ConfigurationProperties (=prefix “spring.datasource.master")   ,public  DataSource 主(),{   .build return 才能DruidDataSourceBuilder.create () ();   ,}/* *   *,才能从库   ,*/,@ bean   ,@ConfigurationProperties (=prefix “spring.datasource.slave")   ,public  DataSource 口水(),{   .build return 才能DruidDataSourceBuilder.create () ();   ,}/* *   *,才能实例化数据源路由   ,*/,@ bean   ,public  DataSourceRouter  dynamicDB (@ qualifier (“master"), DataSource  masterDataSource,   ,,,,,,,,,@ autowired (required =, false), @ qualifier (“slaver"), DataSource  slaveDataSource), {   DataSourceRouter 才能;dynamicDataSource =, new  DataSourceRouter ();   Map<对象,才能,Object>, targetDataSources =, new  HashMap<在();   targetDataSources.put才能(DataSourceEnum.MASTER.getDataSourceName (),, masterDataSource);   if 才能;(slaveDataSource  !=, null), {   ,,targetDataSources.put (DataSourceEnum.SLAVE.getDataSourceName (),, slaveDataSource);   ,,}   dynamicDataSource.setTargetDataSources才能(targetDataSources);   dynamicDataSource.setDefaultTargetDataSource才能(masterDataSource);   return 才能;dynamicDataSource;   ,}/* *   *,才能配置sessionFactory   *,才能@param  dynamicDataSource   *才能@return   *,才能@throws 例外   ,*/,@ bean   ,public  SqlSessionFactory  sessionFactory (@ qualifier (“dynamicDB"), DataSource  dynamicDataSource), throws  Exception  {   SqlSessionFactoryBean 才能;bean =, new  SqlSessionFactoryBean ();   bean.setMapperLocations才能(   ,,,new  PathMatchingResourcePatternResolver () .getResources (“classpath *: mapper/* Mapper.xml"));   bean.setDataSource才能(dynamicDataSource);   return 才能bean.getObject ();   ,}/* *   *,才能创建sqlTemplate   *,才能@param  sqlSessionFactory   *才能@return   ,*/,@ bean   ,public  SqlSessionTemplate  sqlTemplate (@ qualifier (“sessionFactory"), SqlSessionFactory  sqlSessionFactory), {   return 才能;new  SqlSessionTemplate (sqlSessionFactory);   ,}/* *   *,才能事务配置   ,*   *,才能@param  dynamicDataSource   *才能@return   ,*/,@ bean (=name “dataSourceTx")   ,public  DataSourceTransactionManager  dataSourceTransactionManager (@ qualifier (“dynamicDB"), DataSource  dynamicDataSource), {   DataSourceTransactionManager 才能;DataSourceTransactionManager =, new  DataSourceTransactionManager ();   dataSourceTransactionManager.setDataSource才能(dynamicDataSource);   return 才能;dataSourceTransactionManager;   ,}   }

使用SpringBoot如何实现一个MySQL读写分离功能