介绍 <强>主从同步的局限性:强>
本篇文章给大家分享的是有关使用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读写分离功能