青柠檬檬哒|为什么要使用读写分离?SpirngBoot+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进行数据源动态切换
- 帅气的烨烨|为什么600年来无人敢盗, 连孙殿英都怕?,明孝陵至今保存完好,
- 毒蛇|“冰火蛇”是什么来头?为什么它会被认为是地球上毒性最强的蛇?
- 腾讯微博|既然网盘生意那么烧钱,为什么阿里迅雷还要和百度网盘抢饭碗?
- 白宫|火星有生命吗?为什么探测器拍到形似“发动机”、“士兵”等物体
- 道达网络货运平台|为什么连互联网巨头都想加入网络货运?
- 移动支付|为什么全国加油站将停用微信支付?这其中有什么用意呢?
- 帝释天|为什么世界各地的神话竟然惊人地相似?也许宙斯跟帝释天是同一人
- 青柠檬檬哒|无线电二厂虎啸,可做蓝牙音箱的功能机
- 点点雨落山岚|马化腾也表示无奈:为什么你们都将QQ号卖了?原来能换套房子
- 行星|牛奶是必需品还是阴谋?为什么人类是成年以后唯一能喝奶的动物?