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

Spring data-如果主数据源失败,则第二个数据源不会出现

庄新翰
2023-03-14

我正在使用Spring Boot和Spring数据,我想主要使用MySQL数据源,但如果连接失败,请转到H2数据源。

到目前为止,我只是在配置中移动@Primary,但如果我将@Primary放入MySQL(主数据源)并停止我电脑中的MySQL服务器,另一个bean就不会出现了。。。我需要什么?

# Main properties
spring:
  application:
    name: app
  jpa:
    database: default
    show-sql: false
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
        format_sql: false
        current_session_context_class: org.springframework.orm.hibernate5.SpringSessionContext

# Main database: MySQL
main.datasource:
  url: jdbc:mysql://localhost:3306/app?useSSL=false
  driver-class-name: com.mysql.jdbc.Driver
  username: sa
  password: sa

# Backup database: H2
backup.datasource:
  url: jdbc:h2:${project.directory}/app;DB_CLOSE_ON_EXIT=FALSE
  driver-class-name: org.h2.Driver
  username: sa
  password: sa
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories("org.app")
@EntityScan("org.app")
public class MainDataSourceConfig {

    @Primary
    @Bean(name = "mainDataSource")
    @ConfigurationProperties(prefix = "main.datasource")
    public DataSource mainDataSource() {
        return DataSourceBuilder.create().build();
    }

}
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories("org.app")
@EntityScan("org.app")
public class BackupDataSourceConfig {

    @Bean(name = "backupDataSource")
    @ConfigurationProperties(prefix = "backup.datasource")
    public DataSource backupDataSource() {
        return DataSourceBuilder.create().build();
    }

}

谢谢!

共有1个答案

白弘伟
2023-03-14

我知道怎么做。希望这能帮助任何人:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories("org.app")
@EntityScan("org.app")

public class DataSourceConfig {

    private static final String USERNAME = "sa";
    private static final String PASSWORD = "sa";

    @Bean
    @Primary
    public DataSource dataSource() {
        DataSource dataSource;
        try {
            dataSource = getMainDataSource();
            dataSource.getConnection().isValid(500);
        } catch (Exception e) {
            log.error("Main database not valid.", e);
            dataSource =getBackupDataSource();
        }
        return dataSource;
    }

    private DataSource getMainDataSource() {
        return DataSourceBuilder.create()
                .driverClassName("com.mysql.jdbc.Driver")
                .username(USERNAME)
                .password(PASSWORD)
                .url("jdbc:mysql://localhost:3306/app?useSSL=false")
                .build();
    }

    private DataSource getBackupDataSource() {
        return DataSourceBuilder.create()
                .driverClassName("org.h2.Driver")
                .username(USERNAME)
                .password(PASSWORD)
                .url("jdbc:h2:/app;DB_CLOSE_ON_EXIT=FALSE")
                .build();
    }
}

就在豆子上。

 类似资料:
  • 我有一个关于如何在Spring Boot应用程序中处理两个不同数据源的问题。 用例: 我有一个必须始终连接的主存储库(db)(应用程序范围),我对此没有问题,有TransactionManager和EntityManager。 第二个数据库连接应该只有请求范围,并从httpRequest收集动态凭据。 数据源都来自PostgreSQL。 这可能吗?如果可能,实现这一目标的最佳方法是什么? 谢谢你的

  • 另一个使用另一个bank和tbm的类,我尝试了另一个bank的PersistenceContext。

  • 我在Spring Boot中有两个MySQL数据源,因此我有两个配置类。但它似乎只使用主数据源。所有实体都是为主数据源创建的,因此crawlerdb和userdb实体都是在userdb中创建的。 我的userdb主配置: 我的辅助爬网数据库配置: 两个架构的实体类位于不同的包中,如类名上方的EntityScan所示。但当我检查MySQL workbench中创建的模式时,我看到所有实体都是在use

  • 我正在读取火基数据库的数据。以下是存储在数据库中的数据的快照。 在以“8SS...”开头的快照字符串中,是用户的 uid。以下是用于从 firebase 数据库中检索数据的代码。 用户类包含getter和setters。 错误是只有结论。 如何评估 从值事件中读取时的错误是什么? 我尝试使用这个: 然后调用<code>ref。addListenerForSingleValueEvent()但仍然没

  • 定义 SHOW RESOURCES [FROM schemaName] 说明 列 说明 name 数据源名称 type 数据源类型 host 数据源地址 port 数据源端口 db 数据库名称 attribute 数据源参数 示例 mysql> show resources; +------+-------+-----------+------+------+----------------

  • 定义 ADD RESOURCE dataSource [, dataSource] ... ALTER RESOURCE dataSource [, dataSource] ... dataSource: simpleSource | urlSource simpleSource: dataSourceName(HOST=hostName,PORT=port,DB=dbNam