Spring Boot 2 Multiple Datasources инициализирует схему - PullRequest
0 голосов
/ 03 июля 2018

У меня есть приложение 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 и, следовательно, никогда не пытается инициализировать схему. Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Это ожидаемое поведение. Когда указан первичный источник данных, выполняется только схема и данные для этого источника данных. Чтобы иметь такое поведение, вам нужно определить 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.datasource.initialization-mode=never

0 голосов
/ 03 июля 2018

Вы можете использовать несколько Liquibase конфигураций, соответствующих вашим источникам данных. Это может помочь вам в инициализации схемы для обоих источников данных

Образец: -

...

@Bean
@ConfigurationProperties(prefix = "spring.datasource.liquibase")
public LiquibaseProperties primaryLiquibaseProperties() {
    return new LiquibaseProperties();
}

@Bean
public SpringLiquibase primaryLiquibase() {
    return springLiquibase(primaryDataSource(), primaryLiquibaseProperties());
}
@Bean
@ConfigurationProperties(prefix = "spring.runlogdatasource.liquibase")
public LiquibaseProperties secondaryLiquibaseProperties() {
    return new LiquibaseProperties();
}

@Bean
public SpringLiquibase secondaryLiquibase() {
    return springLiquibase(secondaryDataSource(), secondaryLiquibaseProperties());
}

private static SpringLiquibase springLiquibase(DataSource dataSource, LiquibaseProperties properties) {
    SpringLiquibase liquibase = new SpringLiquibase();
    liquibase.setDataSource(dataSource);
    liquibase.setChangeLog(properties.getChangeLog());
    liquibase.setContexts(properties.getContexts());
    liquibase.setDefaultSchema(properties.getDefaultSchema());
    liquibase.setDropFirst(properties.isDropFirst());
    liquibase.setShouldRun(properties.isEnabled());
    liquibase.setLabels(properties.getLabels());
    liquibase.setChangeLogParameters(properties.getParameters());
    liquibase.setRollbackFile(properties.getRollbackFile());
    return liquibase;
}
...

U можете редактировать ваши свойства следующим образом:

**spring.datasource.liquibase.change-log=** classpath:/db/changelog/db.primary.changelog-master.xml
**spring.runlogdatasource.liquibase.change-log=** classpath:/db/changelog/db.secondary.changelog-master.xml
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...