您的位置:首页 > 编程语言 > Java开发

springboot整合mycat

2019-02-17 16:53 127 查看

 

动态数据源项目整合

 

Maven依赖信息

<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

spring:

  datasource:

    ###可读数据源

    select:

      jdbc-url: jdbc:mysql://192.168.212.204:8066/TESTDB1

      driver-class-name: com.mysql.jdbc.Driver

      username: user

      password: user

    ####可写数据源 

    update:

      jdbc-url: jdbc:mysql://192.168.212.204:8066/TESTDB1

      driver-class-name: com.mysql.jdbc.Driver

      username: user

      password: user

    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");

            }

      }

}

 

(adsbygoogle = window.adsbygoogle || []).push({});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MyCAT Spring Spring Boot