我有一个微服务,经过几个小时的工作时间无法连接到数据库并出现以下错误
检索数据库元数据时出错;嵌套异常是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
答案 0 :(得分:2)
我想也许是因为网络问题,你的数据库连接变得陈旧。尝试将以下条目添加到application.properties
:
spring.datasource.testWhileIdle = true
spring.datasource.timeBetweenEvictionRunsMillis = 3600000
spring.datasource.validationQuery = SELECT 1
这将在给定的时间间隔内运行后台线程,并使用验证查询检查数据库连接。如果查询未成功运行,它将从池中逐出该连接。