You want to initialize a database with different data depending on the data source? Should be straight forward:
https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto.data-initialization
Spring Boot can automatically create the schema (DDL scripts) of your JDBC
DataSourceor R2DBCConnectionFactoryand initialize it (DML scripts). It loads SQL from the standard root classpath locations:schema.sqlanddata.sql, respectively. In addition, Spring Boot processes theschema-${platform}.sqlanddata-${platform}.sqlfiles (if present), whereplatformis the value ofspring.sql.init.platform. This allows you to switch to database-specific scripts if necessary. For example, you might choose to set it to the vendor name of the database (hsqldb,h2,oracle,mysql,postgresql, and so on). By default, SQL database initialization is only performed when using an embedded in-memory database. To always initialize an SQL database, irrespective of its type, setspring.sql.init.modetoalways. Similarly, to disable initialization, setspring.sql.init.modetonever. By default, Spring Boot enables the fail-fast feature of its script-based database initializer. This means that, if the scripts cause exceptions, the application fails to start. You can tune that behavior by settingspring.sql.init.continue-on-error.
But, what if you have custom datasources? Then, above mentioned approach will not just work (at all)… So, after some googling and browsing of spring source code, I came upon following solution.
https://stackoverflow.com/questions/51146269/spring-boot-2-multiple-datasources-initialize-schema
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;
}
Just creating some initialization scripts and setting them up on your config, works fine and gets the data initialized. If you control your configuration with profiles, then you can load different script per profile.