当前位置: 首页 > 知识库问答 >
问题:

Spring Boot使用JdbcTemboard和多个数据源自动重新连接到PostgreSQL

莫骞仕
2023-03-14

我有一个Spring Boot v 1.5.1。使用PostgreSQL 9.6作为数据源的RELEASE应用程序。即使在空闲时,我的应用程序也会保持与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,而且我相信我使用的是spring boot starter附带的Tomcat池,但我已经阅读并尝试了这里和这里讨论的建议,但运气不佳。在我的属性文件中,我尝试了:

#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个答案

宦源
2023-03-14

是的,因为您没有使用自动配置的数据源,所以它不工作。

由于您正在从自己的前缀应用属性,因此您只需将test-on-借vality-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
 类似资料:
  • 问题:当我的spring应用程序运行时,同时数据库服务器停止/重新启动,然后db连接丢失并且从未恢复。 com.mysql.jdbc.exceptions.jdbc4.mysqlnontransientConnectionException:连接关闭后不允许任何操作。 服务mysql启动 问题:如何告诉spring在连接丢失后自动重新连接? 这是我的配置:

  • 问题内容: 我有一个客户端,一个服务器和一个数据库。客户端通过EJB远程接口与服务器通信。作为服务器-我使用Wildfly 8.2.0。作为数据库- 我使用MySQL。服务器通过JPA /休眠与MySQL通信。当我关闭MySQL服务器时,Wildfly当然会引发异常。但是,当我再次打开MySQL时- Wildfly仍然会抛出相同的错误。我必须关闭Wildfly,然后重新将Wildfly重新连接到数

  • 在从sping-引导1.5. x切换到sping-引导-2. x后,当db连接关闭时,我的Spring应用程序会不断尝试重新连接到数据库。我甚至无法调用运行状况检查endpoint。 这只发生在spring-boot-2.x中 它可能会尝试重新连接,但就我而言,它不应该阻止整个应用程序。 application.yml pom.xml 当数据库关闭时,我得到以下错误的泛滥。 错误

  • 我正在尝试使用两个数据源与我的SpringBoot应用程序,但无法获得第二个数据源自动连接。我尝试过很多事情,但这是我最接近的一次: 我的Yaml文件: 这是我到目前为止最接近的一次。我之所以说它是最接近的,是因为如果我删除@qualifier,那么我的两个dao方法实际上都可以工作,假设SECOND_SELECT语句对于我的DB1是有效的SQL语句。当我为非主datasouce输入@Qualif

  • 我有一个Java后端的Web应用程序,它使用Tomcat jdbc-pool进行数据库连接。这工作罚款。 然而,在将其导出到其他位置之前,我正在尝试万无一失,最近发生了一个场景,有人重新启动了SQL Server数据库服务,但没有重新启动Tomcat服务。这导致了SQLException:,直到我重新启动Tomcat,迫使jdbc池数据源重新连接。 我在Tomcat jdbc池文档中寻找某种配置,

  • 下面是我到目前为止的代码: 有人能解释一下在和情况下我该做什么吗?以及如何知道网络已断开并重新连接?