当前位置: 首页 > 知识库问答 >
问题:

Spring Boot中的主/辅助故障转移数据源

薛墨一
2023-03-14

我知道如何使2个数据源,但哪里是最好的地方,以处理逻辑什么时候它将使用哪一个。逻辑需要这样运行:

  1. 连接到主
  2. 如果存在连接问题,或者资源不可用,或者连接超时,请尝试重新连接到主服务器。
  3. 如果主服务器无法连接,请尝试连接到辅助服务器
  4. 如果辅助设备无法连接,请继续重试步骤2和步骤3,持续X分钟。

在Spring服务中处理这个问题是最好的/可能的吗?我应该有一个不同的服务来处理这个逻辑,而我的其他服务使用这个逻辑吗?不连接到DB的“Spring方式”而使用“普通的旧java方式”会更好吗?

package com.helloworld.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import oracle.jdbc.pool.OracleDataSource;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;
import java.sql.SQLException;

@Configuration
public class DatasourcesConfig {

    @Primary
    @Bean(name = "primaryDataSource")
    DataSource primaryDataSource() throws SQLException {

        OracleDataSource dataSource = new OracleDataSource();

        dataSource.setUser("user");
        dataSource.setPassword("pass");
        dataSource.setURL("jdbc:oracle:thin:@(...primary connection...)");

        return dataSource;
    }

      @Bean(name = "secondaryDataSource")
      DataSource secondaryDataSource() throws SQLException {

          OracleDataSource dataSource = new OracleDataSource();

          dataSource.setUser("user");
          dataSource.setPassword("pass");
          dataSource.setURL("jdbc:oracle:thin:@(...secondary connection...)");

          return dataSource;
      }

    @Bean(name = "jdbcPrimary")
    @Autowired
    public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource ds) {
        return new JdbcTemplate(ds);
    }

    @Bean(name = "jdbcSecondary")
    @Autowired
    public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource ds) {
        return new JdbcTemplate(ds);
    }

}
package com.helloworld.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

@Service
public class ExampleService {

    @Autowired
    @Qualifier("jdbcPrimary")
    private JdbcTemplate jdbcTemplatePrimary;

    @Autowired
    @Qualifier("jdbcSecondary")
    private JdbcTemplate jdbcTemplateSecondary;

    public SampleDTO getData(String a, String b){

        final String sql = "select a, b from TABLE_A where a=? and b=?";

        // Only checking Primary
        return jdbcTemplatePrimary.queryForObject(sql,
                new Object[]{a,b},
                new SampleRowMapper());

        // Is this the best place to catch exceptions and connect to Secondary?

    }

}

共有1个答案

秦博达
2023-03-14

我能够使用dzone的本文实现这种机制:https://dzone.com/articles/using-HA-jdbc-with-spring-boot使用这里的enter link description

HA-JDBC是非常可配置的,并且有几种不同的故障转移策略。

在我们的例子中,我们设置到两个不同数据库的连接,我们的主数据库备份到辅助数据库,因此可能不是当前数据库。

    null
 类似资料:
  • 问题内容: 在JBoss数据源中,如何为我想要的数据库故障转移提供多个连接字符串。 将有两个具有相同表的Mysql db,即DB1和DB2。我想将数据插入DB1,如果DB1关闭,那么我需要将其插入DB2。在插入DB2期间,如果DB1出现了,我需要将其余数据插入DB1中。如何在JBoss中配置它? 问题答案: 这将适用于jboss映射

  • 我正在尝试用6台机器实现一个Redis集群。我有一个由六台机器组成的流浪集群: 运行redis服务器 我编辑了上述所有服务器的/etc/redis/redis.conf文件,添加了这个 然后我在六台机器中的一台上运行了这个程序; Redis集群已启动并运行。我通过在一台机器上设置值手动检查它显示在其他机器上。 我的问题是,当我关闭或停止任何一台主机上的redis server时,整个集群都会停止运

  • 我有两个ActiveMQ Artemis服务器(server1和server2)。两者都是主人,在这种情况下没有奴隶。Artemis支持主对主故障转移吗?如果是,任何一个可以提供代理配置。目前,我已经在两个服务器的文件中定义了以下配置。 此外,如果可能的话,您是否可以提供示例客户端代码以测试主到主故障转移场景?

  • 我试图设置一个简单的,并将其配置为将主服务器故障转移到从服务器。 我设置了4个VM(使用),每个VM上都安装了redis。我有一个主机器和两个奴隶。最后一台机器是哨兵。 主服务器和从服务器都有默认配置,只是我将绑定地址更改为,而从服务器有行。 在哨兵中,我遵循了基本教程,并放入了以下设置: 我做错了什么?

  • 我们使用MQ作为传递消息的主要路径。这是我们的制度运作不可或缺的一部分。消息代理有时会失败,所有相关的队列也会随之失败。在camel中,有没有一种方法可以启动故障切换,并在其启动时恢复到主故障切换?

  • 我有3个redis Sentinel的盒子设置: 在我的主人死后,哨兵进行了故障转移到R2。我将M1重新联机(清除了一些磁盘空间),现在M1还活着,但是是R2的奴隶。是否有一种自动的(或半自动的)方法,使M1再次成为主,R2再次成为M1和我的流量的从属,使用M1作为主redis实例?