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

Spring Boot 2多个数据源初始化架构

东门奕
2023-03-14

我有一个Spring Boot 2应用程序,它使用两个数据源——一个Oracle和一个H2。H2数据源被设置为辅助数据源,我想在启动时为它创建架构,但它从不启动schema.sql文件。这是我的数据源配置文件:

@Configuration
public class DataSourceConfig {
    @Bean
    @Primary
    @ConfigurationProperties("spring.datasource")
    public DataSourceProperties primaryDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @Primary
    @ConfigurationProperties("spring.datasource")
    public DataSource primaryDataSource() {
        return primaryDataSourceProperties().initializeDataSourceBuilder().build();
    }

    @Bean
    @ConfigurationProperties("spring.runlogdatasource")
    public DataSourceProperties runlogDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @ConfigurationProperties("spring.runlogdatasource")
    public DataSource runlogDataSource() {
        return runlogDataSourceProperties().initializeDataSourceBuilder().build();
    }
}

这是我的申请表。属性文件:

spring.datasource.url=jdbc:oracle:thin:@my.database.com:1521/mydb
spring.datasource.username=test
spring.datasource.password=ENC(3PXcnoBndLpWN1EcMtmIn+odOwhdWjSrqANijutxuekKEIOco64Jew==)
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.initialization-mode=never
spring.datasource.hikari.connection-timeout=60000
spring.datasource.hikari.maximum-pool-size=10
jasypt.encryptor.bean=stringEncryptor
spring.runlogdatasource.url=jdbc:h2:~/runlogdb;CIPHER=AES;DB_CLOSE_ON_EXIT=FALSE;
spring.runlogdatasource.username=sa
spring.runlogdatasource.password=ENC(3PXcnoBndLpWN1EcMtmIn+odOwhdWjSrqANijutxuekKEIOco64Jew==)
spring.runlogdatasource.driverClassName=org.h2.Driver
spring.runlogdatasource.platform=h2
spring.runlogdatasource.schema=classpath:schema-h2.sql

对于主数据源,我可以看到它进入了DataSourceInitializeInvoker,在那里它试图加载模式,但因为没有模式,所以它只能加载所有模式。sql文件它跳过了那个。然而,我有一个模式h2。sql文件,但对于辅助数据源,它从未进入DataSourceInitializeInvoker,因此从未尝试初始化架构。任何帮助都将不胜感激!

共有1个答案

逄学潞
2023-03-14

这是预期的行为。当指定主数据源时,只执行该数据源的模式和数据。要实现这种行为,您需要做的是为两个数据源中的每一个定义DataSourcePrializer

        @Bean
        public DataSourceInitializer dataSourceInitializer1(@Qualifier("datasource1") DataSource datasource) {
            ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
            resourceDatabasePopulator.addScript(new ClassPathResource("schema-h22.sql"));
            resourceDatabasePopulator.addScript(new ClassPathResource("data-h22.sql"));

                DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();
                dataSourceInitializer.setDataSource(datasource);
                dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator);
                return dataSourceInitializer;
        }

    @Bean
    public DataSourceInitializer dataSourceInitializer2(@Qualifier("datasource2") DataSource datasource) {
        ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
        resourceDatabasePopulator.addScript(new ClassPathResource("schema-h21.sql"));
        resourceDatabasePopulator.addScript(new ClassPathResource("data-h21.sql"));

            DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();
            dataSourceInitializer.setDataSource(datasource);
            dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator);
            return dataSourceInitializer;
    }

您还需要禁用默认的spring数据初始化。您可以通过spring来实现这一点。数据源。初始化模式=从不

 类似资料:
  • 我有一个关于Spring Boot和使用JpaRepositories的多个数据源的设置的问题。 [4编辑如下] 项目的结构看起来像这样: 所以我有两个域(A和B),DataSource设置是单独处理的。 抽象JPA配置类用于减少冗余,并使用自定义数据源管理器来处理数据源: 位于域A包中的配置实现如下所示: 然后,实际存储库被定义为JPA存储库: 这似乎工作,根据应用程序日志: 之后,以及成功的F

  • 初始化数据 打开MainSetup类,在Daos语句后面插入新建根用户的代码 // 初始化默认根用户 if (dao.count(User.class) == 0) { User user = new User(); user.setName("admin"); user.setPassword

  • 我需要初始化具有相同形状的多个Numpy数组。想知道哪种方式是最好的: 为每个人写一行: 或者有更好的方法?

  • 我正在开发我的第一个 Swing 应用程序,现在提出了一个难题:在静态初始化期间或开始实际执行后执行引导和资源初始化。我是什么意思...我有单例: 因此,方法如下所示 或者,也许我在启动后手动初始化资源,然后运行它。逻辑上正确的方式是什么?

  • 问题内容: 这非常丑陋: 有没有办法在一行上声明这些变量? 问题答案: 上述方法的缺点是,您需要计算左侧的名称数,并且在右侧具有完全相同数量的空列表(例如,通过调用或更明确地)。 最主要的是, 不要 使用类似 也不 这将使所有名称都引用 相同的 空列表!

  • windows操作系统下无法在一个php文件里初始化多个Worker, 例如下面test.php <?php ... $socket_server = new Worker("tcp://0.0.0.0:5555"); $socket_server->on.... $websocket_server = new Worker("websocket://0.0.0.0:6666"); $websoc