2017-01-13 3 views
1

Я работаю над приложением Spring Boot с интеграцией Liquibase для настройки базы данных. Мы используем другой пользователь для изменения базы данных, которые мы конфигурируемся с помощью application.properties файлаLiquibase в приложении весенней загрузки держит 10 подключений открытыми

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 различные microservices в развертывании, и мы заметили, что для каждого запущенного экземпляра, LiquiBase открывает 10 соединений и его никогда не закрывает эти соединения, если мы не остановим приложение. Это в основном означает, что в процессе разработки мы регулярно сталкиваемся с лимитом соединения нашего экземпляра Amazon RDS.

Сейчас, в разработке, 40 из 74 активных соединений, занимаемых Liquibase. Если мы когда-либо захотим пойти на производство с этим, включив автомасштабирование для всех микросервисов, это будет означать, что нам придется перемасштабировать базу данных, чтобы не нажимать никаких ограничений на соединение.

Есть ли способ

  • Телль LiquiBase не использовать пул соединений 10 соединений
  • Телль LiquiBase, чтобы остановить или закрыть соединение

До сих пор я не нашел в документации по как это сделать.

ответ

4

Благодаря откликом Славе мне удалось решить проблему с последующим DATASOURCE класс по конфигурации

@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; 
    } 

} 

Документальный на свойства можно найти на сайте Tomcat: https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html

  • initialSize: Начальное количество соединений, которые создаются, когда пул запускается
  • maxActive: Максимальное количество активных соединений, которые могут быть выделены из этого пула в то же время
  • minIdle: минимальное количество установленных соединений, которые должны храниться в бассейне в любое время
  • maxAge: Время в миллисекундах, чтобы сохранить это соединение. Когда соединение будет возвращено в пул, пул проверит, будет ли достигнуто текущее время когда подключено> maxAge, и если это так, он закрывает соединение, а не возвращает его в пул. Значение по умолчанию равно 0, что означает, что соединения будут оставлены открытыми, и при возврате соединения с пулом не будет проверяться возраст.
  • minEvictableIdleTimeMillis: минимальное время, в течение которого объект может простаивать в пуле до того, как он будет допущен к выселению.

Так как представляется, не будет течь соединение, это просто конфигурация по умолчанию источника данных, который не является оптимальным для LiquiBase , если использовать специальный источник данных. Я не ожидаю, что это будет проблемой, если источником данных Liquibase является ваш основной источник данных.

+0

Хорошая работа, большое спасибо! –

1

Я не знаю, почему Liquibase не закрывает соединение, может быть, это ошибка, и вам нужно create an issue.

Чтобы установить пул соединений для Liquibase, вам необходимо создать собственный источник данных и пометить его аннотацией @LiquibaseDataSource.

Похожие вопросы предоставить более подробную информацию:

+0

Хорошо, это может быть очень интересно, потому что с помощью специального источника данных я могу указать 'datasource.dbcp2.initial-size = 1' –

+0

Используя следующий код, мне удалось сократить количество подключений до 1. Однако, несмотря на настройку максимальный возраст до 10 секунд, соединение никогда не закрывается, что заставляет меня подозревать, что есть утечка соединения. 'DataSource ds = DataSourceBuilder.create(). Username (" "). Password (" "). Url (" "). DriverClassName (" "). Build();' '((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 (10000); ' –

+0

@ stephane-nicoll Привет, не могли бы вы подтвердить, является ли сохранение открытых подключений Liquibase ошибкой? –

Смежные вопросы