Jimbo_liu 2019-07-01 09:28 采纳率: 0%
浏览 382

Spring Boot+durid+mybatis 怎么实现数据源的主备功能?当A数据源断开后自动切换到B数据源

如题:

_现在项目有一个需求,数据库服务器是双网卡的。
当A网卡网络坏掉的情况下,软件应该通过B网链接到数据库进行数据操作。

目前项目是用JAVA开发的,使用的是 Spring Boot + druid + mybatis

2019/7/2
今天有 一个思路,就是实现druid的数据源链接断开时间和重连时间,
当数据源断开重连时去判断重连的URL地址是否正常,但是druid的事件有没有大佬使用过???

  • 写回答

1条回答 默认 最新

  • java奋斗者 2024-04-30 15:42
    关注

    在Spring Boot应用中使用Druid作为连接池,结合MyBatis实现数据源的主备自动切换,主要涉及以下几个步骤:

    1. 添加依赖
      确保你的pom.xml文件中包含了Spring Boot Starter Data JPA(如果使用JPA)、MyBatis Starter、Druid Starter以及相应的数据库驱动依赖。

      <dependencies>
       <!-- Spring Boot Starter Data JPA (如果需要) -->
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-data-jpa</artifactId>
       </dependency>
      
       <!-- Spring Boot Starter MyBatis -->
       <dependency>
           <groupId>org.mybatis.spring.boot</groupId>
           <artifactId>mybatis-spring-boot-starter</artifactId>
           <version>YOUR_MYBATIS_VERSION</version> <!-- 使用适合的版本 -->
       </dependency>
      
       <!-- Druid 数据源 -->
       <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>druid-spring-boot-starter</artifactId>
           <version>YOUR_DRUID_VERSION</version> <!-- 使用适合的版本 -->
       </dependency>
      
       <!-- 数据库驱动,例如MySQL -->
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
           <scope>runtime</scope>
       </dependency>
      </dependencies>
      
    2. 配置多数据源
      在application.yml或application.properties中配置两个数据源(主数据源和备用数据源),并定义一个数据源路由类来管理这些数据·源。

      spring:
      datasource:
       dynamic:
         primary: master # 主数据源的名称,默认为主数据源
         strict: false # 是否严格匹配数据源
         datasource:
           master:
             url: jdbc:mysql://master_db_url:port/db_name?useSSL=false&serverTimezone=UTC
             username: master_username
             password: master_password
             type: com.alibaba.druid.pool.DruidDataSource
           slave:
             url: jdbc:mysql://slave_db_url:port/db_name?useSSL=false&serverTimezone=UTC
             username: slave_username
             password: slave_password
             type: com.alibaba.druid.pool.DruidDataSource
      
    3. 实现数据源路由
      可以使用AbstractRoutingDataSource来实现数据源的动态切换。创建一个继承自AbstractRoutingDataSource的类,并重写determineCurrentLookupKey方法来决定使用哪个数据源。

      @Configuration
      public class DynamicDataSourceConfig {
      
       @Value("${spring.datasource.dynamic.primary}")
       private String primary;
      
       @Bean
       public DataSource dataSource() {
           DynamicDataSource dynamicDataSource = new DynamicDataSource();
           Map<Object, Object> targetDataSources = new HashMap<>();
           targetDataSources.put("master", masterDataSource());
           targetDataSources.put("slave", slaveDataSource());
           dynamicDataSource.setTargetDataSources(targetDataSources);
           dynamicDataSource.setDefaultTargetDataSource(masterDataSource()); // 默认数据源
           return dynamicDataSource;
       }
      
       // 主数据源配置
       @Bean
       @Primary
       @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.master")
       public DataSource masterDataSource() {
           return DruidDataSourceBuilder.create().build();
       }
      
       // 备用数据源配置
       @Bean
       @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.slave")
       public DataSource slaveDataSource() {
           return DruidDataSourceBuilder.create().build();
       }
      
       // 数据源路由类
       public static class DynamicDataSource extends AbstractRoutingDataSource {
           @Override
           protected Object determineCurrentLookupKey() {
               // 实现逻辑判断,根据情况返回"data_source_key",比如可以通过AOP切面监控数据库连接状态,异常时切换
               return DataSourceContextHolder.getDataSource(); // 假设DataSourceContextHolder是一个持有当前数据源标识的类
           }
       }
      }
      
    4. 数据源切换逻辑
      实现一个DataSourceContextHolder类来维护当前线程的数据源上下文,以及在必要时(如检测到主数据源异常)切换数据源的逻辑。这通常涉及到AOP切面来监控数据库操作的异常,并在检测到主数据源不可用时,将数据源切换标识设置为备用数据源。

    5. MyBatis配置
      确保MyBatis配置正确地指向了动态数据源,并且Mapper接口和SQL映射文件能够正常工作。
      通过以上步骤,你可以实现Spring Boot应用中Druid与MyBatis集成的数据源主备功能,当主数据源断开时,通过监控和切换逻辑自动切换到备用数据源。注意,实际应用中可能还需要考虑数据一致性、事务管理等复杂问题。

    评论

报告相同问题?

悬赏问题

  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)
  • ¥15 keil里为什么main.c定义的函数在it.c调用不了
  • ¥50 切换TabTip键盘的输入法
  • ¥15 可否在不同线程中调用封装数据库操作的类
  • ¥15 微带串馈天线阵列每个阵元宽度计算
  • ¥15 keil的map文件中Image component sizes各项意思
  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据