青柠檬檬哒|为什么要使用读写分离?SpirngBoot+MyBatis如何实现读写分离?

为什么要使用读写分离?读写分离是互联网公司常用的技术方案 , 用来分摊数据库压力的 。 我们知道在一般的互联网项目中都是读多写少 , 这就导致数据库在大部分时候都在进行读操作 , 那么在高并发、高流量读的情况下 , 数据库的读操作就可能成为系统的性能瓶颈 。
本篇幅不会讲解数据库的主从搭建 , 重点讲解Springboot+mybatis代码层面的读写分离实现 , 下面我们进入正题
读写分离代码实现1、配置多数据源
读写分离至少要包含一个写库、一个读库 , 那就会涉及到多数据源 , 数据库配置如下:
#以一主一从为例 , 一主多从是类似的配置mysql:datasource:master:jdbc-url:jdbc:mysql://localhost:3306/testdb1username:rootpassword:123456driver-class-name:com.mysql.jdbc.Driverslave1:jdbc-url:jdbc:mysql://localhost:3306/testdb2username:rootpassword:123456driver-class-name:com.mysql.jdbc.Driver【青柠檬檬哒|为什么要使用读写分离?SpirngBoot+MyBatis如何实现读写分离?】2、继承spring的AbstractRoutingDataSource进行多数据源管理
publicclassMyRoutingDataSourceextendsAbstractRoutingDataSource{@Nullable@OverrideprotectedObjectdetermineCurrentLookupKey(){returnDBContextHolder.get();}}3、数据源相关配置
@ConfigurationpublicclassDataSourceConfig{@Bean(name="masterDataSource")@ConfigurationProperties(prefix="mysql.datasource.master")publicDataSourcemasterDataSource(){returnDataSourceBuilder.create().build();}@Bean(name="slaveDataSource")@ConfigurationProperties(prefix="mysql.datasource.slave1")publicDataSourceslaveDataSource(){returnDataSourceBuilder.create().build();}@Bean(name="myRoutingDataSource")publicDataSourcemyRoutingDataSource(@Qualifier("masterDataSource")DataSourcemasterDataSource,@Qualifier("slaveDataSource")DataSourceslaveDataSource){MaptargetDataSource=newHashMap<>();targetDataSource.put(DBTypeEnum.MASTER,masterDataSource);targetDataSource.put(DBTypeEnum.SLAVE,slaveDataSource);MyRoutingDataSourcemyRoutingDataSource=newMyRoutingDataSource();myRoutingDataSource.setDefaultTargetDataSource(masterDataSource);myRoutingDataSource.setTargetDataSources(targetDataSource);returnmyRoutingDataSource;}}//sqlSessionFactory和事务相关配置@EnableTransactionManagement@ConfigurationpublicclassMyBatisConfig{@Resource(name="myRoutingDataSource")privateDataSourcemyRoutingDataSource;@BeanpublicSqlSessionFactorysqlSessionFactory()throwsException{SqlSessionFactoryBeansqlSessionFactoryBean=newSqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(myRoutingDataSource);sqlSessionFactoryBean.setMapperLocations(newPathMatchingResourcePatternResolver().getResources("classpath:mapper/**/*.xml"));returnsqlSessionFactoryBean.getObject();}@BeanpublicPlatformTransactionManagerplatformTransactionManager(){returnnewDataSourceTransactionManager(myRoutingDataSource);}}4、使用AOP进行数据源动态切换