【问题标题】:Spring Boot 2 Multiple Datasources initialize schemaSpring Boot 2 多个数据源初始化模式
【发布时间】:2018-12-11 06:39:40
【问题描述】:

我有一个使用两个数据源的 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();
    }
}

这是我的 application.properties 文件:

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

对于主数据源,我可以看到它进入了 DataSourceInitializerInvoker,这是它尝试加载架构的地方,但由于没有 schema-all.sql 文件,它会跳过该文件。但是,我确实有一个 schema-h2.sql 文件,但对于辅助数据源,它永远不会进入 DataSourceInitializerInvoker,因此永远不会尝试初始化模式。任何帮助将不胜感激!

【问题讨论】:

    标签: java database spring spring-boot initialization


    【解决方案1】:

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

            @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.datasource.initialization-mode=never来做到这一点

    【讨论】:

      猜你喜欢
      • 2017-09-21
      • 2019-05-15
      • 2016-12-16
      • 1970-01-01
      • 2021-12-03
      • 2017-03-28
      • 2018-02-14
      • 2016-08-23
      • 2018-03-22
      相关资源
      最近更新 更多