Spring启动应用程序中的Liquibase保持10个连接打开

时间:2017-01-13 13:57:39

标签: spring spring-boot liquibase

我正在使用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

我们目前在部署中有3个不同的微服务,我们注意到,对于每个正在运行的实例,Liquibase打开10个连接,除非我们停止应用程序,否则它永远不会关闭这些连接。这基本上意味着在开发过程中我们会定期达到Amazon RDS实例的连接限制。

目前,在开发过程中,74个活动连接中有40个被Liquibase占用。如果我们想要通过这种方式进行生产,为所有微服务启用了自动调节,那就意味着我们不得不超量扩展数据库,以免达到任何连接限制。

有没有办法

  • 告诉liquibase不要使用10个连接的连接池
  • 告诉liquibase停止或关闭连接

到目前为止,我找不到有关如何执行此操作的文档。

3 个答案:

答案 0 :(得分:4)

感谢Slava的响应,我设法通过以下数据源配置类来解决问题

@Override
protected void onResume() {
    super.onResume();
    // save values here for resume
}

可以在Tomcat网站上找到属性的文档:https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html

  • initialSize:启动池时创建的初始连接数
  • maxActive:可以同时从此池分配的最大活动连接数
  • minIdle:始终应保留在池中的最小已建立连接数
  • maxAge:保持此连接的时间(以毫秒为单位)。当连接返回到池时,池将检查是否现在 - 何时连接>已达到maxAge,如果是,则关闭连接而不是将其返回到池中。默认值为0,这意味着连接将保持打开状态,并且在将连接返回到池时不会进行年龄检查。
  • minEvictableIdleTimeMillis:对象在符合驱逐资格之前可能在池中闲置的最短时间。

所以它似乎不是连接泄漏,它只是数据源的默认配置,如果使用专用数据源,它对于Liquibase 来说不是最佳的。如果liquibase数据源是您的主要数据源,我不认为这是一个问题。

答案 1 :(得分:3)

对连接池管理的更改是在Spring Boot版本2.0.6.RELEASE中引入的,并且仅在使用Spring Boot Actuator时才生效。有一个执行器端点(默认情况下启用),使您可以获取Liquibase应用的更改集。为此,Liquibase使其数据库连接保持打开状态。您可以使用management.endpoint.liquibase.enabled = false禁用端点,在这种情况下,Liquibase使用的连接池将在初次运行后关闭。

答案 2 :(得分:1)

我不知道为什么liquibase没有关闭连接,也许这是一个bug,你应该create an issue

要为liquibase设置连接池,您必须创建自定义数据源并使用@LiquibaseDataSource注释对其进行标记。

相关问题提供了更多详细信息: