SpringBoot+MyBatis+MySQL读写分离

springboot+mybatis实现主从库读写分离 springboot+mybatis或者mybatis-plus实现主从库读写分离 阅读详情

1. 引言


读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做。因此,一般来讲,读写分离有两种实现方式。第一种是依靠中间件(比如:MyCat),也就是说应用程序连接到中间件,中间件帮我们做SQL分离;第二种是应用程序自己去做分离。这里我们选择程序自己来做,主要是利用Spring提供的路由数据源,以及AOP

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

然而,应用程序层面去做读写分离最大的弱点(不足之处)在于无法动态增加数据库节点,因为数据源配置都是写在配置中的,新增数据库意味着新加一个数据源,必然改配置,并重启应用。当然,好处就是相对简单。

SpringBoot+MyBatis+MySQL读写分离

 

2. AbstractRoutingDataSource


基于特定的查找key路由到特定的数据源。它内部维护了一组目标数据源,并且做了路由key与目标数据源之间的映射,提供基于key查找数据源的方法。

SpringBoot+MyBatis+MySQL读写分离

 

3. 实践

3.1. maven依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.cjs.example</groupId>
 <artifactId>cjs-datasource-demo</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <packaging>jar</packaging>
 <name>cjs-datasource-demo</name>
 <description></description>
 <parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>2.0.5.RELEASE</version>
 <relativePath/> <!-- lookup parent from repository -->
 </parent>
 <properties>
 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 <java.version>1.8</java.version>
 </properties>
 <dependencies>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-aop</artifactId>
 </dependency>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-jdbc</artifactId>
 </dependency>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <dependency>
 <groupId>org.mybatis.spring.boot</groupId>
 <artifactId>mybatis-spring-boot-starter</artifactId>
 <version>1.3.2</version>
 </dependency>
 <dependency>
 <groupId>org.apache.commons</groupId>
 <artifactId>commons-lang3</artifactId>
 <version>3.8</version>
 </dependency>
 <dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <scope>runtime</scope>
 </dependency>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-test</artifactId>
 <scope>test</scope>
 </dependency>
 </dependencies>
 <build>
 <plugins>
 <plugin>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-maven-plugin</artifactId>
 </plugin>
 <!--<plugin>
 <groupId>org.mybatis.generator</groupId>
 <artifactId>mybatis-generator-maven-plugin</artifactId>
 <version>1.3.5</version>
 <dependencies>
 <dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <version>5.1.46</version>
 </dependency>
 </dependencies>
 <configuration>
 <configurationFile>${basedir}/src/main/resources/myBatisGeneratorConfig.xml</configurationFile>
 <overwrite>true</overwrite>
 </configuration>
 <executions>
 <execution>
 <id>Generate MyBatis Artifacts</id>
 <goals>
 <goal>generate</goal>
 </goals>
 </execution>
 </executions>
 </plugin>-->
 </plugins>
 </build>
</project>

3.2. 数据源配置

application.yml

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

spring:
 datasource:
 master:
 jdbc-url: jdbc:mysql://192.168.102.31:3306/test
 username: root
 password: 123456
 driver-class-name: com.mysql.jdbc.Driver
 slave1:
 jdbc-url: jdbc:mysql://192.168.102.56:3306/test
 username: pig # 只读账户
 password: 123456
 driver-class-name: com.mysql.jdbc.Driver
 slave2:
 jdbc-url: jdbc:mysql://192.168.102.36:3306/test
 username: pig # 只读账户
 password: 123456
 driver-class-name: com.mysql.jdbc.Driver

多数据源配置

package com.cjs.example.config;
import com.cjs.example.bean.MyRoutingDataSource;
import com.cjs.example.enums.DBTypeEnum;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
/**
 * 关于数据源配置,参考SpringBoot官方文档第79章《Data Access》
 * 79. Data Access
 * 79.1 Configure a Custom DataSource
 * 79.2 Configure Two DataSources
 */
@Configuration
public class DataSourceConfig {
 @Bean
 @ConfigurationProperties("spring.datasource.master")
 public DataSource masterDataSource() {
 return DataSourceBuilder.create().build();
 }
 @Bean
 @ConfigurationProperties("spring.datasource.slave1")
 public DataSource slave1DataSource() {
 return DataSourceBuilder.create().build();
 }
 @Bean
 @ConfigurationProperties("spring.datasource.slave2")
 public DataSource slave2DataSource() {
 return DataSourceBuilder.create().build();
 }
 @Bean
 public DataSource myRoutingDataSource(@Qualifier("masterDataSource") DataSource masterDataSource,
 @Qualifier("slave1DataSource") DataSource slave1DataSource,
 @Qualifier("slave2DataSource") DataSource slave2DataSource) {
 Map<Object, Object> targetDataSources = new HashMap<>();
 targetDataSources.put(DBTypeEnum.MASTER, masterDataSource);
 targetDataSources.put(DBTypeEnum.SLAVE1, slave1DataSource);
 targetDataSources.put(DBTypeEnum.SLAVE2, slave2DataSource);
 MyRoutingDataSource myRoutingDataSource = new MyRoutingDataSource();
 myRoutingDataSource.setDefaultTargetDataSource(masterDataSource);
 myRoutingDataSource.setTargetDataSources(targetDataSources);
 return myRoutingDataSource;
 }
}

这里,我们配置了4个数据源,1个master,2两个slave,1个路由数据源。前3个数据源都是为了生成第4个数据源,而且后续我们只用这最后一个路由数据源。

MyBatis配置

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

package com.cjs.example.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.annotation.Resource;
import javax.sql.DataSource;
@EnableTransactionManagement
@Configuration
public class MyBatisConfig {
 @Resource(name = "myRoutingDataSource")
 private DataSource myRoutingDataSource;
 @Bean
 public SqlSessionFactory sqlSessionFactory() throws Exception {
 SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
 sqlSessionFactoryBean.setDataSource(myRoutingDataSource);
 sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
 return sqlSessionFactoryBean.getObject();
 }
 @Bean
 public PlatformTransactionManager platformTransactionManager() {
 return new DataSourceTransactionManager(myRoutingDataSource);
 }
}

由于Spring容器中现在有4个数据源,所以我们需要为事务管理器和MyBatis手动指定一个明确的数据源。

3.3. 设置路由key / 查找数据源

目标数据源就是那前3个这个我们是知道的,但是使用的时候是如果查找数据源的呢?

首先,我们定义一个枚举来代表这三个数据源

package com.cjs.example.enums;
public enum DBTypeEnum {
 MASTER, SLAVE1, SLAVE2;
}

接下来,通过ThreadLocal将数据源设置到每个线程上下文中

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

package com.cjs.example.bean;
import com.cjs.example.enums.DBTypeEnum;
import java.util.concurrent.atomic.AtomicInteger;
public class DBContextHolder {
 private static final ThreadLocal<DBTypeEnum> contextHolder = new ThreadLocal<>();
 private static final AtomicInteger counter = new AtomicInteger(-1);
 public static void set(DBTypeEnum dbType) {
 contextHolder.set(dbType);
 }
 public static DBTypeEnum get() {
 return contextHolder.get();
 }
 public static void master() {
 set(DBTypeEnum.MASTER);
 System.out.println("切换到master");
 }
 public static void slave() {
 // 轮询
 int index = counter.getAndIncrement() % 2;
 if (counter.get() > 9999) {
 counter.set(-1);
 }
 if (index == 0) {
 set(DBTypeEnum.SLAVE1);
 System.out.println("切换到slave1");
 }else {
 set(DBTypeEnum.SLAVE2);
 System.out.println("切换到slave2");
 }
 }
}

获取路由key

package com.cjs.example.bean;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import org.springframework.lang.Nullable;
public class MyRoutingDataSource extends AbstractRoutingDataSource {
 @Nullable
 @Override
 protected Object determineCurrentLookupKey() {
 return DBContextHolder.get();
 }
}

设置路由key

默认情况下,所有的查询都走从库,插入/修改/删除走主库。我们通过方法名来区分操作类型(CRUD)

package com.cjs.example.aop;
import com.cjs.example.bean.DBContextHolder;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class DataSourceAop {
 @Pointcut("!@annotation(com.cjs.example.annotation.Master) " +
 "&& (execution(* com.cjs.example.service..*.select*(..)) " +
 "|| execution(* com.cjs.example.service..*.get*(..)))")
 public void readPointcut() {
 }
 @Pointcut("@annotation(com.cjs.example.annotation.Master) " +
 "|| execution(* com.cjs.example.service..*.insert*(..)) " +
 "|| execution(* com.cjs.example.service..*.add*(..)) " +
 "|| execution(* com.cjs.example.service..*.update*(..)) " +
 "|| execution(* com.cjs.example.service..*.edit*(..)) " +
 "|| execution(* com.cjs.example.service..*.delete*(..)) " +
 "|| execution(* com.cjs.example.service..*.remove*(..))")
 public void writePointcut() {
 }
 @Before("readPointcut()")
 public void read() {
 DBContextHolder.slave();
 }
 @Before("writePointcut()")
 public void write() {
 DBContextHolder.master();
 }
 /**
 * 另一种写法:if...else... 判断哪些需要读从数据库,其余的走主数据库
 */
// @Before("execution(* com.cjs.example.service.impl.*.*(..))")
// public void before(JoinPoint jp) {
// String methodName = jp.getSignature().getName();
//
// if (StringUtils.startsWithAny(methodName, "get", "select", "find")) {
// DBContextHolder.slave();
// }else {
// DBContextHolder.master();
// }
// }
}

有一般情况就有特殊情况,特殊情况是某些情况下我们需要强制读主库,针对这种情况,我们定义一个主键,用该注解标注的就读主库

package com.cjs.example.annotation;
public @interface Master {
}

例如,假设我们有一张表member

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

package com.cjs.example.service.impl;
import com.cjs.example.annotation.Master;
import com.cjs.example.entity.Member;
import com.cjs.example.entity.MemberExample;
import com.cjs.example.mapper.MemberMapper;
import com.cjs.example.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
public class MemberServiceImpl implements MemberService {
 @Autowired
 private MemberMapper memberMapper;
 @Transactional
 @Override
 public int insert(Member member) {
 return memberMapper.insert(member);
 }
 @Master
 @Override
 public int save(Member member) {
 return memberMapper.insert(member);
 }
 @Override
 public List<Member> selectAll() {
 return memberMapper.selectByExample(new MemberExample());
 }
 @Master
 @Override
 public String getToken(String appId) {
 // 有些读操作必须读主数据库
 // 比如,获取微信access_token,因为高峰时期主从同步可能延迟
 // 这种情况下就必须强制从主数据读
 return null;
 }
}

4. 测试

package com.cjs.example;
import com.cjs.example.entity.Member;
import com.cjs.example.service.MemberService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class CjsDatasourceDemoApplicationTests {
 @Autowired
 private MemberService memberService;
 @Test
 public void testWrite() {
 Member member = new Member();
 member.setName("zhangsan");
 memberService.insert(member);
 }
 @Test
 public void testRead() {
 for (int i = 0; i < 4; i++) {
 memberService.selectAll();
 }
 }
 @Test
 public void testSave() {
 Member member = new Member();
 member.setName("wangwu");
 memberService.save(member);
 }
 @Test
 public void testReadFromMaster() {
 memberService.getToken("1234");
 }
}

查看控制台

SpringBoot+MyBatis+MySQL读写分离

 

SpringBoot+MyBatis+MySQL读写分离

 

SpringBoot+MyBatis+MySQL读写分离

 

SpringBoot+MyBatis+MySQL读写分离

 

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

5. 工程结构


SpringBoot+MyBatis+MySQL读写分离

深入理解Spring Boot结合MyBatis调用MySQL,并实现主从复制读写分离 MyBatis作为一款灵活的持久层框架,与Spring Boot结合使用,可以为开发者提供高效、简洁的数据库访问层。本文将详细讲解如何在Spring Boot项目中结合MyBatis调用MySQL,并实现主从复制的读写分离。我们将以电商交易系统为案例,通过实际代码示例展示如何进行配置和实现。 阅读详情

相关推荐

springboot+mybatis+mybatis +mysql读写分离(AOP方式)

引言 读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做。因此,一般来讲,读写分离有两种实现方式。 第一种是依靠中间件(比如:MyCat),也就是说应用程序连接到中间件,中间件帮我们做SQL分离; 第二种是应用程序自己去做分离。 这里我们选择程序自己来做,主要是利用Spring提供的路由数据源,以及AOP 然而...

xudong的博客 3448

SpringBoot+Mybatis实现读写分离

SpringBoot+Mybatis实现读写分离 最近的项目中需要实现简单的读写分离,由于项目中使用的是SpringBoot+Mybatis,简单的实现了一下功能 读写分离的概念已经提过很多次:单个数据库的承受服务请求的压力太大,于是将数据库的读操作和写操作分别执行,由于我们的应用大部分是读操作,写操作频率较低,于是常见的结构是一主多从;(当然生产环境是有主备切换的,这里不赘述) 核心思想 基于S...

weixin_38091679的博客 893

Spring Boot + MyBatis + MySQL 实现读写分离,面试必知必会

很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。最后祝愿各位身体健康,顺利拿到心仪的offer!由于文章的篇幅有限,所以这次的蚂蚁金服和京东面试题答案整理在了PDF文档里存中…(img-mCeRhp5c-1711720102094)]

wfegre的博客 1341

Spring Boot + MyBatis 实现读写分离

Spring Boot + MyBatis 实现读写分离 MySQL主从复制配置 项目下载 一、版本号 Spring Boot:2.2.2.Release <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.2.RELEASE</versi

xzkwuli的博客 832

SpringBoot+MyBatis+MySQL读写分离实例

基于特定的查找key路由到特定的数据源。它内部维护了一组目标数据源,并且做了路由key与目标数据源之间的映射,提供基于key查找数据源的方法。

lt_xiaodou的博客 485

3D打印机新手必看:VSCode+PlatformIO搭建Marlin固件编译环境(附常见错误解决)

本文为3D打印机新手详细介绍了如何使用Visual Studio Code和PlatformIO搭建Marlin固件编译环境。内容涵盖从软件安装、源码配置到编译实战的全流程,并重点解析了依赖冲突、内存不足等高频错误的解决方案,帮助用户快速上手并成功编译自定义固件。

j2k3l4的博客 705

采用aop进行数据库读写分离

采用aop进行数据库读写分离 转自: https://mp.weixin.qq.com/s__biz=MzA5NzgzODI5NA==&mid=2454036042&idx=2&sn=723a3855a586237938f256f7267703f4&chksm=872b8bf3b05c02e52b56b9f2bd46b6e1a6656fba41942b6fd9a0...

lwy572039941的博客 1107

基于相位检测与锁相环的DIY超声波风速仪设计与实现

相位检测是信号处理中的一项基础技术,它通过测量两个周期信号之间的相位差来获取信息。其核心原理在于,当信号在介质中传播时,外部因素(如风速)会改变其传播速度,从而导致接收端信号的相位发生偏移。锁相环(PLL)是实现高精度相位检测的关键电路,它能动态调整本地振荡器的频率,以跟踪并锁定输入信号的相位,从而将微小的相位变化转换为易于测量的电压信号。这项技术的工程价值在于其对电路精度要求相对较低,鲁棒性好,非常适合低成本、高灵敏度的测量应用。在气象监测、工业传感和消费电子等领域,相位检测技术被广泛用于风速风向测量、位

weixin_29540599的博客 387

Springboot+mybatis实现双数据源读写分离

Springboot+mybatis实现双数据源读写分离

L482453568的博客 1131

【VMware篇】7-通过ISO镜像升级VMware Esxi

本文主要介绍Dell服务器上安装的ESXi升级的方法之一(采用ISO升级)。

chen_yunan的博客 5519

Workbench下列车转向架随机振动疲劳分析

结果中添加功率谱响应工具(Response PSD Tool),可以查看几何体以及远程点上的功率谱密度,如下图11所示,这里查看几何体上某一硬点的加速度功率谱密度响应曲线,如下图12所示。结果中添加疲劳工具(Fatigue Tool),查看列车转向架的疲劳寿命情况,这里采用窄带的寿命假设理论,曝光时间为1s指明计算出的疲劳寿命的基本单位是秒,寿命结果如下图14所示,可以看到最大寿命为1e35s,最小寿命为2.3542e18s,注意单位制,可再次基础上将其转换为小时或天。频域上的统计计算,软件很快计算完成。

ansysxuexizhe的博客 2605

SpringBoot 之MyBatis+MySQL读写分离

实践 POM依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId&gt

const_ 333

基于高频变压器的隔离式推挽栅极驱动电路

摘要:本文介绍了一种基于高频变压器的隔离式推挽栅极驱动电路,通过变压器实现电气隔离,为功率MOS管提供可靠驱动信号。电路包含输入侧PWM信号处理、变压器磁耦合隔离传输以及副边驱动逻辑等关键部分,利用电阻电容网络控制开关速度并防止误触发。该隔离驱动方案广泛应用于高压开关电源、新能源汽车电机控制器、光伏逆变器和工业变频器等需要高电压隔离及抗干扰能力的电力电子设备中,有效保障系统安全性和可靠性。

qq_37999850的博客 490

Spring Boot + MyBatis + MySQL 实现读写分离!

读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做。因此,一般来讲,读写分离有两种实现方式。第一种是依靠中间件(比如:MyCat),也就是说应用程序连接到中间件,中间件帮我们做SQL分离;第二种是应用程序自己去做分离。这里我们选择程序自己来做,主要是利用Spring提供的路由数据源,以及AOP。

奔走的蚂蚁的博客 1358

西门子TP900精智系列触摸屏和三菱Q系列PLC以太网通信的组态步骤

西门子TP900精智系列触摸屏和三菱Q系列PLC以太网通信的组态步骤

Robot_PLC_HMI_Automation 6100

多图详解VSCode搭建Python开发环境

本文通过多图的方式详细介绍了VSCode搭建Python开发环境,希望能对学习Python的同学们有所帮助。 文章目录 1. VSCode的介绍和安装 2. 安装插件 2.1 安装中文插件 2.2 安装Python插件 2.3 安装远程插件 3. 远程连接服务器 3.1 配置ssh 3.2 运行代码 3.3 调试代码

weixin_43178406的博客 8万+

springboot基于Mybatis mysql实现读写分离

https://www.jb51.net/article/162393.htm

qq_32814555的博客 345

生物量预测:基于Swin-Unet模型的生物量模型预测

本文提出了一种基于Swin-Unet架构的多源遥感地上生物量(AGB)预测方法。该方法整合了光学影像、SAR雷达影像、气候环境参数以及地形数据(坡度和坡向)等多源信息,通过24个输入通道(13+2+7+1+1)构建预测模型。研究采用Min-Max归一化预处理数据,并使用80%训练集、16%验证集和20%测试集的划分策略。模型基于Swin-Unet 2D架构,设置64个初始滤波器、4层深度、4×4堆叠数和2×2补丁大小。该方法通过整合多源遥感数据和先进深度学习架构,为AGB反演提供了新的解决方案。

此星光明博客 64

「Spring Boot + MyBatis-Plus + MySQL 一主两从」读写分离实战教程

本文介绍了基于Spring Boot 3.3.12、MyBatis-Plus和MySQL实现一主两从读写分离架构的完整方案。文章详细讲解了Docker Compose配置MySQL主从复制环境,项目结构设计,以及关键依赖配置(包括dynamic-datasource多数据源组件)。主要内容包括:application.yml中多数据源的配置方法(主库master+两个从库slave1/slave2),MyBatis-Plus分页插件的集成,以及通过AOP切面动态切换数据源的实现。该方案覆盖了企业级应用中99

qq_39251691的博客 1534

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

linux spring boot 连接mysql_SpringBoot+MyBatis+MySQL读写分离实战

阅读本文约需要5分钟大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈)。上次老师跟大家分享了八点写出优雅的Java代码的建议的知识,今天跟大家分享下SpringBoot+MyBatis+MySQL读写分离实战的知识。1 引言读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们...

weixin_39986178的博客 120

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

hadoop mysql mybatis_SpringBoot+MyBatis+MySQL读写分离

1. 引言读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做。因此,一般来讲,读写分离有两种实现方式。第一种是依靠中间件(比如:MyCat),也就是说应用程序连接到中间件,中间件帮我们做SQL分离;第二种是应用程序自己去做分离。这里我们选择程序自己来做,主要是利用Spring提供的路由数据源,以及AOP然而,应用...

weixin_39704066的博客 229

SpringBoot+Mybatis-Plus实现mysql读写分离方案

SpringBoot+Mybatis-plus实现读写分离方案1. 引入mybatis-plus相关包,pom.xml文件2. 配置文件application.property增加多库配置mysql 数据源配置3. 配置数据源及注解数据源配置 MultiDataSourceConfig.Java数据库枚举类注解4. Mybatis-plus配置5. 增加数据源管理类指定选择数据源6. 增加aop切面6. 实际应用 1. 引入mybatis-plus相关包,pom.xml文件 2. 配置文件applica

Abean 4213

SpringBoot + MyBatis + MySql利用 aop 实现读写分离

前几个月做了一个项目,但是目前只部署到了一台服务器上面,所以我总感觉会出点问题,特别是数据库那一块,后期数据量大起来了以后,这一块应该是一个比较大的瓶颈,所以未雨绸缪,先把AOP实现读写分离那一块实现了,以后需要的时候再加上去就行了。 本人菜鸡,本科还没毕业,希望各位大佬嘴下留情。 SpringBoot 版本: <parent> <groupId>org.spr...

qq_40453068的博客 544

在Spring Boot + MyBatis项目中实现MySQL读写分离

在Spring Boot和MyBatis项目中实现MySQL读写分离,主要有两种思路:一种是在应用层通过代码和配置手动控制,另一种是借助中间件自动路由。

悟空码字的博客 1022
上一篇: Kafka分区与消费者的关系
下一篇: 分布式之消息队列
javaQQ群 866865133
博客等级 码龄8年 59粉丝 309原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值