Запустите Spring Boot Application с отключенным 2-м источником данных - PullRequest
0 голосов
/ 11 января 2019

Я использую 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

1 Ответ

0 голосов
/ 11 января 2019

ИСПРАВЛЕНО, было необходимо добавить

config.setInitializationFailTimeout (-1L);

во второй конфигурации DataSource

...