基于mycat整合springboot项目实现读写分离

    技术2022-07-11  88

    基于mycat实现项目读写分离

    pom.xmlapplication.ymlDataSourceContextHolderDataSourceConfigDynamicDataSourceSwitchDataSourceAOP

    主要的原理步骤是,springboot项目整合mycat后,通过aop拦截后切换数据源,然后在通过mycat路由到相应的数据库中实现读写分离,如下是一些核心文件及配置。 项目地址:springboot-mysqlcopy

    pom.xml

    <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.4.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</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>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> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.23</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>

    application.yml

    server: port: 8282 spring: datasource: ###可读数据源 select: jdbc-url: jdbc:mysql://192.168.78.231:8066/TESTDB driver-class-name: com.mysql.jdbc.Driver username: user password: user ####可写数据源 update: jdbc-url: jdbc:mysql://192.168.78.231:8066/TESTDB driver-class-name: com.mysql.jdbc.Driver username: root password: root type: com.alibaba.druid.pool.DruidDataSource

    DataSourceContextHolder

    @Component @Lazy(false) public class DataSourceContextHolder { // 采用ThreadLocal 保存本地多数据源 private static final ThreadLocal<String> contextHolder = new ThreadLocal<>(); // 设置数据源类型 public static void setDbType(String dbType) { contextHolder.set(dbType); } public static String getDbType() { return contextHolder.get(); } public static void clearDbType() { contextHolder.remove(); } }

    DataSourceConfig

    @Configuration public class DataSourceConfig { // 创建可读数据源 @Bean(name = "selectDataSource") @ConfigurationProperties(prefix = "spring.datasource.select") // application.properteis中对应属性的前缀 public DataSource dataSource1() { return DataSourceBuilder.create().build(); } // 创建可写数据源 @Bean(name = "updateDataSource") @ConfigurationProperties(prefix = "spring.datasource.update") // application.properteis中对应属性的前缀 public DataSource dataSource2() { return DataSourceBuilder.create().build(); } }

    DynamicDataSource

    //在Spring 2.0.1中引入了AbstractRoutingDataSource, 该类充当了DataSource的路由中介, 能有在运行时, 根据某种key值来动态切换到真正的DataSource上。 @Component @Primary public class DynamicDataSource extends AbstractRoutingDataSource { @Autowired @Qualifier("selectDataSource") private DataSource selectDataSource; @Autowired @Qualifier("updateDataSource") private DataSource updateDataSource; /** * 这个是主要的方法,返回的是生效的数据源名称 */ @Override protected Object determineCurrentLookupKey() { System.out.println("DataSourceContextHolder:::" + DataSourceContextHolder.getDbType()); return DataSourceContextHolder.getDbType(); } /** * 配置数据源信息 */ @Override public void afterPropertiesSet() { Map<Object, Object> map = new HashMap<>(); map.put("selectDataSource", selectDataSource); map.put("updateDataSource", updateDataSource); setTargetDataSources(map); setDefaultTargetDataSource(updateDataSource); super.afterPropertiesSet(); } }

    SwitchDataSourceAOP

    @Aspect @Component @Lazy(false) @Order(0) // Order设定AOP执行顺序 使之在数据库事务上先执行 public class SwitchDataSourceAOP { // 这里切到你的方法目录 @Before("execution(* com.mayikt.service.*.*(..))") public void process(JoinPoint joinPoint) { String methodName = joinPoint.getSignature().getName(); if (methodName.startsWith("get") || methodName.startsWith("count") || methodName.startsWith("find") || methodName.startsWith("list") || methodName.startsWith("select") || methodName.startsWith("check")) { DataSourceContextHolder.setDbType("selectDataSource"); } else { // 切换dataSource DataSourceContextHolder.setDbType("updateDataSource"); } } }

    以上就是项目整合mycat后实现对数据库的读写分离,自我总结学习并分享给大家! 项目地址:springboot-mysqlcopy 学习参考:蚂蚁课堂

    Processed: 0.015, SQL: 9