P_W*_*999 1 spring liquibase spring-boot
我正在使用与 Liquibase 集成的 Spring Boot 应用程序来设置数据库。我们使用不同的用户进行我们使用 application.properties 文件配置的数据库更改
liquibase.user=abc
liquibase.password=xyz
liquibase.url=jdbc:postgresql://something.eu-west-1.rds.amazonaws.com:5432/app?ApplicationName=${appName}-liquibase
liquibase.enabled=true
liquibase.contexts=dev,postgres
Run Code Online (Sandbox Code Playgroud)
目前我们部署了 3 个不同的微服务,我们注意到对于每个正在运行的实例,Liquibase 打开 10 个连接并且它永远不会关闭这些连接,除非我们停止应用程序。这基本上意味着在开发过程中,我们经常会遇到 Amazon RDS 实例的连接限制。
目前,在开发过程中,74 个活动连接中有 40 个被 Liquibase 占用。如果我们想将其投入生产,为所有微服务启用自动缩放,这意味着我们将不得不过度扩展数据库,以免达到任何连接限制。
有没有办法
到目前为止,我没有找到有关如何执行此操作的文档。
感谢 Slava 的响应,我设法通过以下数据源配置类解决了问题
@Configuration
public class LiquibaseDataSourceConfiguration {
private static final Logger LOG = LoggerFactory.getLogger(LiquibaseDataSourceConfiguration.class);
@Autowired
private LiquibaseDataSourceProperties liquibaseDataSourceProperties;
@LiquibaseDataSource
@Bean
public DataSource liquibaseDataSource() {
DataSource ds = DataSourceBuilder.create()
.username(liquibaseDataSourceProperties.getUser())
.password(liquibaseDataSourceProperties.getPassword())
.url(liquibaseDataSourceProperties.getUrl())
.driverClassName(liquibaseDataSourceProperties.getDriver())
.build();
if (ds instanceof org.apache.tomcat.jdbc.pool.DataSource) {
((org.apache.tomcat.jdbc.pool.DataSource) ds).setInitialSize(1);
((org.apache.tomcat.jdbc.pool.DataSource) ds).setMaxActive(2);
((org.apache.tomcat.jdbc.pool.DataSource) ds).setMaxAge(1000);
((org.apache.tomcat.jdbc.pool.DataSource) ds).setMinIdle(0);
((org.apache.tomcat.jdbc.pool.DataSource) ds).setMinEvictableIdleTimeMillis(60000);
} else {
// warnings or exceptions, whatever you prefer
}
LOG.info("Initialized a datasource for {}", liquibaseDataSourceProperties.getUrl());
return ds;
}
}
Run Code Online (Sandbox Code Playgroud)
可以在 Tomcat 的站点上找到属性的文档:https : //tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html
所以它似乎不是连接泄漏,它只是数据源的默认配置,如果您使用专用数据源,这对于 Liquibase 来说不是最佳的。如果 liquibase 数据源是您的主要数据源,我认为这不会成为问题。
更新:这已在2.5.0-M2 中得到修复,Liquibase 现在使用SimpleDriverDataSource无连接池。
原答案:这个对连接池管理的改动是在 Spring Boot 版本中引入的2.0.6.RELEASE,只有使用 Spring Boot Actuator 才会生效。有一个执行器端点(默认启用),它允许您获取 Liquibase 应用的更改集。为此,Liquibase 保持其数据库连接打开。您可以使用 禁用端点management.endpoint.liquibase.enabled = false,在这种情况下,Liquibase 使用的连接池将在初始运行后关闭。
12. Liquibase:https : //docs.spring.io/spring-boot/docs/2.0.6.RELEASE/actuator-api/html/| 归档时间: |
|
| 查看次数: |
4256 次 |
| 最近记录: |