Spring Boot автоматически переподключается к PostgreSQL с использованием JdbcTemplate и нескольких источников данных

У меня есть приложение Spring Boot v 1.5.1.RELEASE, которое использует PostgreSQL 9.6 в качестве источника данных. Мое приложение остается подключенным к Postgres даже в режиме ожидания, но если соединение потеряно, приложение не подключается и вместо этого выдает:

org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is org.postgresql.util.PSQLException: This connection has been closed.
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:342) ~[spring-jdbc-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:366) ~[spring-jdbc-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.jdbc.support.SQLErrorCodesFactory.getErrorCodes(SQLErrorCodesFactory.java:212) ~[spring-jdbc-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.setDataSource(SQLErrorCodeSQLExceptionTranslator.java:134) [spring-jdbc-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.<init>(SQLErrorCodeSQLExceptionTranslator.java:97) [spring-jdbc-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.jdbc.support.JdbcAccessor.getExceptionTranslator(JdbcAccessor.java:99) [spring-jdbc-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:649) [spring-jdbc-4.3.6.RELEASE.jar:4.3.6.RELEASE]

Хотя я не использую JPA и считаю, что я использую пул Tomcat, который поставляется с spring-boot-starter, я прочитал и попробовал предложения, обсуждаемые здесь и здесь, но безуспешно. В моем файле свойств я попытался:

#spring.datasource.tomcat.test-on-borrow=true
#spring.datasource.tomcat.validation-query=SELECT 1

#spring.datasource.tomcat.test-while-idle=true
#spring.datasource.tomcat.time-between-eviction-runs-millis=3600000
#spring.datasource.tomcat.validation-query=SELECT 1

#spring.datasource.dbcp2.test-on-borrow=true
#spring.datasource.dbcp2.validation-query=SELECT 1

spring.datasource.test-on-borrow=true
spring.datasource.validation-query=SELECT 1

Однако я использую два источника данных, настроенных так:

@Configuration
public class DatabaseConfiguration 
{
    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.ds_pgsql_rtmain")
    public DataSource rtmainDataSource() 
    {
        DataSource dataSource = DataSourceBuilder.create().build();
        return dataSource;
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.ds_pgsql_pdns")
    public DataSource pdnsDataSource() 
    {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @Primary
    public JdbcTemplate rtmainJdbcTemplate(DataSource rtmainDataSource) 
    {
        return new JdbcTemplate(rtmainDataSource);
    }

    @Bean
    public JdbcTemplate pdnsJdbcTemplate(@Qualifier("pdnsDataSource") DataSource pdnsDataSource) {
        return new JdbcTemplate(pdnsDataSource);
    }   

}

Я не уверен, что проблема в том, что я неправильно настроил пул данных или потому что пул не работает, когда я вручную настраиваю источники данных. Или что-то другое. Помощь будет принята с благодарностью, спасибо.

1 ответ

Решение

Да, поскольку вы не используете автоматически настроенный источник данных, он не работает.

Поскольку вы применяете свойства из своего собственного префикса, вам просто нужно поставить test-on-borrow а также validation-query на свой собственный префикс. Попробуй это:

spring.ds_pgsql_rtmain.test-on-borrow=true
spring.ds_pgsql_rtmain.validation-query=SELECT 1

spring.ds_pgsql_pdns.test-on-borrow=true
spring.ds_pgsql_pdns.validation-query=SELECT 1
Другие вопросы по тегам