【问题标题】:jdbcTemplate database connection is closed in Spring Boot micro servicejdbcTemplate 数据库连接在 Spring Boot 微服务中关闭
【发布时间】:2026-02-04 08:35:01
【问题描述】:

我有一个微服务,经过几个小时的工作时间后无法连接到数据库并出现以下错误

检索数据库元数据时出错;嵌套异常是 org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData;嵌套异常是 com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed。

如果我重新部署它,它会起作用,几个小时或几天后错误就会恢复。

这是我的数据库连接配置类(我使用2个不同的数据源)

@Getter
@Configuration
public class ApiConfiguration {

    @Autowired
    private Environment env;

    @Value("${spring.datasource.url}")
    private String legacyURL;

    @Value("${spring.datasource.username}")
    private String legacyUsername;

    @Value("${spring.datasource.password}")
    private String legacyPassword;

    @Value("${spring.datasource.driverClassName}")
    private String legacyDriverClassName;

    @Bean(name = "legacyDataSource")
    @Primary
    public JdbcTemplate getLegacyJdbcTemplate() {
        DataSource ds = DataSourceBuilder.create()
                .url(legacyURL)
                .username(legacyUsername)
                .password(legacyPassword)
                .driverClassName(legacyDriverClassName)
                .build();
        return new JdbcTemplate(ds);
    }
}

application.properties

# Legacy spring.datasource.url=jdbc:sqlserver://${DB_SERVER};PortNumber=${DB_PORT};failoverPartner=${DB_FAILOVER_SERVER};databaseName=${DB_NAME};applicationName=questions-and-answers-api;
spring.datasource.username=${DB_USER}
spring.datasource.password=${DB_PASSWORD}
spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver

【问题讨论】:

标签: database spring-boot connection


【解决方案1】:

我认为可能是由于网络问题,您的数据库连接变得陈旧。尝试将以下条目添加到application.properties

spring.datasource.testWhileIdle = true
spring.datasource.timeBetweenEvictionRunsMillis = 3600000
spring.datasource.validationQuery = SELECT 1

这将在给定的时间间隔内运行一个后台线程,并使用验证查询检查数据库连接。如果查询未成功运行,它将从池中逐出该连接。

【讨论】: