在Spring Boot微服务中关闭了jdbcTemplate数据库连接

时间:2018-03-20 09:21:34

标签: database spring-boot connection

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

  

检索数据库元数据时出错;嵌套异常是org.springframework.jdbc.support.MetaDataAccessException:提取DatabaseMetaData时出错;嵌套异常是com.microsoft.sqlserver.jdbc.SQLServerException:连接已关闭。

如果我重新部署它,它可以工作,在几个小时或几天后错误恢复。

这是我的数据库连接配置类(我使用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

1 个答案:

答案 0 :(得分:2)

我想也许是因为网络问题,你的数据库连接变得陈旧。尝试将以下条目添加到application.properties

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

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