Я использую Spring Boot 1.5.15, базы данных HikariCP 3.2.0 и 2, MSSQL и Oracle.
Тогда строка учетных данных jdbc в файле yml верна, приложение успешно запускается. Кроме того, если во время работы приложения происходит сбой соединения, оно также работает хорошо и просто автоматически переподключается к базе данных, тогда это возможно. Но мне нужно быть готовым запустить приложение, если 2-я база данных Oracle не работает или что-то в этом роде. Итак, затем я изменяю строку jdbc для этого и пытаюсь запустить приложение, которое терпит неудачу с
com.zaxxer.hikari.pool.HikariPool $ PoolInitializationException: не удалось инициализировать пул:
Я ищу сеть и нахожу разные свойства HikariCP или spring.datasource и пробую их, но это не помогло.
Не могли бы вы помочь мне решить эту проблему.
Я настраиваю его, используя файл yml:
spring:
datasource:
driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
url: jdbc:sqlserver:***
username: ***
password: ***
type: com.zaxxer.hikari.HikariDataSource
jpa:
hibernate:
ddl-auto: none
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
show-sql: true
properties:
dialect: org.hibernate.dialect.SQLServer2012Dialect
database: default
jackson:
date-format: com.fasterxml.jackson.databind.util.StdDateFormat
logging:
config: classpath:logback-remote.xml
file: /usr/share/tomcat/app.log
pqa:
integration:
datasource:
driverClassName: oracle.jdbc.OracleDriver
url: jdbc:oracle:***
username: ***
password: ***
type: com.zaxxer.hikari.HikariDataSource
И конфигурация Java, мой код для обоих источников данных
MyApplication.class
@SpringBootApplication
public class MyApplication extends SpringBootServletInitializer{
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(MyApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
ApplicationConfig.class
@Configuration
@Import({
ControllerConfig.class,
PersistenceConfig.class,
PlrIntegrationConfig.class,
SecurityConfig.class
})
public class ApplicationConfig {
}
PersistenceConfig.java
@Configuration
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactory",
basePackages = {"com.my.app.repository"})
@EnableJpaAuditing(auditorAwareRef = "auditorProvider")
public class PersistenceConfig {
@Autowired
private Environment env;
@Value("${spring.datasource.url}")
private String jdbcUrl;
@Value("${spring.datasource.driverClassName}")
private String driverClassName;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Primary
@Bean(name = "dataSource")
public DataSource dataSource() {
HikariConfig config = new HikariConfig();
config.setDriverClassName(driverClassName);
config.setJdbcUrl(jdbcUrl);
config.setUsername(username);
config.setPassword(password);
config.addDataSourceProperty("minimum-idle", "8");
config.addDataSourceProperty("maximum-pool-size", "100");
config.addDataSourceProperty("idle-timeout", "10000");
config.addDataSourceProperty("connection-timeout", "10000");
config.addDataSourceProperty("max-lifetime", "120000");
HikariDataSource dataSource = new HikariDataSource(config);
return dataSource;
}
@Primary
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder,
@Qualifier("dataSource") DataSource dataSource) {
return builder
.dataSource(dataSource)
.packages("com.my.app.entity")
.properties(additionalJpaProperties())
.persistenceUnit("app")
.build();
}
private Map<String, ?> additionalJpaProperties() {
Map<String, String> jpaProperties = new HashMap<>();
jpaProperties.put("hibernate.hbm2ddl.auto", env.getProperty("spring.jpa.hibernate.ddl-auto"));
jpaProperties.put("hibernate.dialect", env.getProperty("spring.jpa.properties.dialect"));
jpaProperties.put("hibernate.show_sql", env.getProperty("spring.jpa.show-sql"));
jpaProperties.put("hibernate.format_sql", env.getProperty("spring.jpa.properties.hibernate.format_sql"));
return jpaProperties;
}
@Primary
@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManager(@Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
@Bean
public AuditorAware<String> auditorProvider(){
return new AuditorAwareImpl();
}
}
PlrIntegrationConfig.class
@Configuration
@ComponentScan(value = {
"com.my.app.integration.plr.job",
})
@Import({PlrIntegrationPersistenceConfig.class})
public class PlrIntegrationConfig {
}
PlrIntegrationPersistenceConfig.class
@EnableJpaRepositories(entityManagerFactoryRef = "plrInEntityManagerFactory",
transactionManagerRef = "plrInTransactionManager",
basePackages = {"com.my.app.integration.plr.persistence.repository"})
@Configuration
public class PlrIntegrationPersistenceConfig {
@Value("${pqa.integration.datasource.url}")
private String jdbcUrl;
@Value("${pqa.integration.datasource.driverClassName}")
private String driverClassName;
@Value("${pqa.integration.datasource.username}")
private String username;
@Value("${pqa.integration.datasource.password}")
private String password;
@Bean(name = "plrInDataSource")
public DataSource dataSource() {
HikariConfig config = new HikariConfig();
config.setDriverClassName(driverClassName);
config.setJdbcUrl(jdbcUrl);
config.setUsername(username);
config.setPassword(password);
config.addDataSourceProperty("minimum-idle", "8");
config.addDataSourceProperty("maximum-pool-size", "100");
config.addDataSourceProperty("idle-timeout", "10000");
config.addDataSourceProperty("connection-timeout", "10000");
config.addDataSourceProperty("max-lifetime", "120000");
HikariDataSource dataSource = new HikariDataSource(config);
return dataSource;
}
@Bean(name = "plrInEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean plrInEntityManagerFactory(EntityManagerFactoryBuilder builder,
@Qualifier("plrInDataSource") DataSource dataSource) {
LocalContainerEntityManagerFactoryBean plrInEMFBean = builder.dataSource(dataSource)
.packages("com.my.app.integration.plr.persistence.entity")
.persistenceUnit("plrIn")
.build();
Map<String, Object> properties = new HashMap<>();
properties.put("hibernate.dialect", "org.hibernate.dialect.Oracle12cDialect");
plrInEMFBean.setJpaPropertyMap(properties);
return plrInEMFBean;
}
@Bean(name = "plrInTransactionManager")
public PlatformTransactionManager plrInTransactionManager(@Qualifier("plrInEntityManagerFactory") EntityManagerFactory plrInEntityManagerFactory) {
return new JpaTransactionManager(plrInEntityManagerFactory);
}
}
UPDATE:
ИСПРАВЛЕНО, было необходимо добавить
config.setInitializationFailTimeout (-1L); * +1032 *
во второй конфигурации DataSource