У меня есть проект подключения к нескольким базам данных (Oracle & SQLServer), некоторые из которых не всегда обязательны или недоступны при запуске приложения, особенно в среде разработчиков.
Я ищу способразрешить запуск приложения без подключения к базе данных.Нам требуется соединение с этими БД только при выполнении определенных задач, при которых используется промежуточная база данных, требующая определенного сетевого доступа, который не всегда доступен в dev.
Здесь, с нашим соединением Oracle (которое находится под определеннымсеть):
У нас была конфигурация, которая позволяла запускать приложение, но выдавал ошибки при запуске тестов из-за ошибочного приведения HikariDataSource:
@Configuration
@EnableJpaRepositories(
basePackages = "com.bar.foo.repository.oracle",
entityManagerFactoryRef = "oracleEntityManager",
transactionManagerRef = "oracleTransactionManager"
)
public class OracleConfiguration {
private final Logger log = LoggerFactory.getLogger(this.getClass());
@Inject
private Environment environment;
@Value("${spring.datasource.oracle.ddl-auto:none}")
private String hibernateddlAuto;
@Value("${spring.datasource.oracle.dialect:org.hibernate.dialect.Oracle10gDialect}")
private String hibernateDialect;
@Bean
@Primary
@ConfigurationProperties("spring.datasource.oracle")
public DataSourceProperties oracleDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@Primary
@ConfigurationProperties("spring.datasource.hikari")
public DataSource oracleDataSource() {
HikariDataSource ds = (HikariDataSource) oracleDataSourceProperties().initializeDataSourceBuilder().build();
ds.setPoolName(environment.getProperty("spring.datasource.oracle.poolName"));
return ds;
}
@Bean
@Primary
public LocalContainerEntityManagerFactoryBean oracleEntityManager() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setPackagesToScan("com.bar.foo.domain.oracle");
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
HashMap<String, Object> properties = new HashMap<>();
properties.put("hibernate.ddl-auto", hibernateddlAuto);
properties.put("hibernate.dialect", hibernateDialect);
em.setJpaPropertyMap(properties);
em.setDataSource(oracleDataSource());
return em;
}
@Primary
@Bean
public PlatformTransactionManager oracleTransactionManager() {
JpaTransactionManager transactionManager
= new JpaTransactionManager();
transactionManager.setEntityManagerFactory(
oracleEntityManager().getObject());
return transactionManager;
}
}
Я переместил эту конфигурацию для расширенияHikariConfig выглядит следующим образом:
@Configuration
@EnableJpaRepositories(
basePackages = "com.bar.foo.repository.oracle",
entityManagerFactoryRef = "oracleEntityManager",
transactionManagerRef = "oracleTransactionManager"
)
@ConfigurationProperties("spring.datasource.oracle")
public class OracleConfiguration extends HikariConfig{
@Bean
@Primary
public DataSource oracleDataSource() {
return new HikariDataSource(this);
}
@Bean
@Primary
public LocalContainerEntityManagerFactoryBean oracleEntityManager() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setPackagesToScan("com.bar.foo.domain.oracle");
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
HashMap<String, Object> properties = new HashMap<>();
properties.put("hibernate.ddl-auto", hibernateddlAuto);
properties.put("hibernate.dialect", hibernateDialect);
em.setJpaPropertyMap(properties);
em.setDataSource(oracleDataSource());
return em;
}
@Bean
@Primary
public PlatformTransactionManager oracleTransactionManager() {
JpaTransactionManager transactionManager
= new JpaTransactionManager();
transactionManager.setEntityManagerFactory(
oracleEntityManager().getObject());
return transactionManager;
}
, который не запускается, если база данных Oracle недоступна.
Использование встроенной базы данных не подходит для нашего варианта использования, поскольку нам не всегда нужно это соединение, и когда мыНужны ли нам конкретные данные, скопированные с производстваРазделение этого на несколько микросервисов / приложений также не допускается, так как это было бы огромным рефакто и не очень подходит для нашего варианта использования (мы объединяем данные из нескольких источников в окончательный вариант).
Есть ли простой способ разрешить это?