Приложение Spring boot не будет работать быстро, если пользовательский менеджер транзакций не сможет подключиться - PullRequest
2 голосов
/ 13 апреля 2020

Я делаю весеннее загрузочное приложение с настраиваемым менеджером транзакций с собственным источником данных. Кстати, я использую hikariCP в качестве источника данных

@Configuration
@EnableTransactionManagement
@EnableJpaRespositories(
basePackages = "..."
entityManagerFactoryRef = "..."
transactionManagerRef = "..."
)
public class myDataSourceConfigration {
    @Bean
    @Primary
    @Configuration("myconfig.datasource")
    public DataSourceProperties myconfigDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @Primary
    @Configuration("myconfig.datasource.configurations")
    public DataSource myconfigDataSource(){
        return myconfigDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build;
    }

    @Bean
    @Primary
    public LocalContainerEntityManagerFactoryBean myconfigEntityManagerFactory(EntityManagerFactoryBuilder builder){
        return builder                
                 .dataSource(myconfigDataSource)
                 .packages(MyClass.class)
                 .build;
    }

    @Bean
    @Primary
    public PlatformTransactionManager myconfigTransactionManager(
             final @Qualifier ("myconfigEntityManagerFactory")LocalContainerEntityManagerFactoryBean myconfigEntityManagerFactory){
        return new JpaTransactionManager(myconfigEntityManagerFactory.getObject());
    }
}

В моем application.properties у меня есть эти конфигурации

myconfig.datasource.url:url
myconfig.datasource.username:username
myconfig.datasource.password:password
myconfig.datasource.driverClassName:driverClass

Теперь все это работает, когда все хорошо, но проблема в том, когда он не работает Например, если я введу неправильный пароль, hikari выдает исключение из пула соединений, но приложение продолжает работать. Я хочу, чтобы приложение не сработало, выдало исключение и завершило работу, но у меня возникли проблемы с выяснением этого. Я попытался добавить другую конфигурацию, называемую initializationFailTimeout, например myConfig.datasource.initializationFailTimeout:5000, но та же проблема, я вижу исключение, но приложение продолжает работать.

В любом случае, как сделать так, чтобы при быстрой загрузке hikari генерировалось исключение подключения? *

Спасибо

1 Ответ

3 голосов
/ 13 апреля 2020

Мне удалось это исправить, сначала инициализировав компонент HikariConfig, а затем передав его в конструктор HikariDataSource:

@Bean("myDatasourceHikariConfig")
@ConfigurationProperties(prefix = "spring.datasource")
public HikariConfig hikariConfig() {
    return new HikariConfig();
}

@Bean("myDatasource")
public DataSource myDataSource(@Qualifier("myDatasourceHikariConfig") HikariConfig hikariConfig) {
    return new HikariDataSource(hikariConfig);
}

Соответствующая часть application.properties:

spring.datasource.jdbc-url: jdbc-url
spring.datasource.username: username
spring.datasource.password: WRONG
spring.datasource.driver-class-name: driver
spring.datasource.type: com.zaxxer.hikari.HikariDataSource

#Following are hikari specific properties
spring.datasource.initializationFailTimeout: 5000
spring.datasource.maximum-pool-size: 10
spring.datasource.minimum-idle: 1
spring.datasource.connection-timeout: 30000
spring.datasource.pool-name: datasource-pool

Обратите внимание, что все эти свойства имеют префикс spring.datasource (я не использую spring.datasource.hikari из DataSourceAutoConfiguration.class).

Использование DataSourceBuilder для инициализации источника данных приводит к точно такому же поведению, как вы описали (приложение выдает исключение из-за неправильного пароля, но, тем не менее, продолжает запускаться). Я подтверждаю, что он прекращает запуск только тогда, когда у вас нет собственного менеджера транзакций и т. Д. c.

Я использую Spring Boot 2.1.9 с HikariCP 3.2.0.

...