Дженкинс при развертывании веб-приложения SpringMVC JPA Соединения MySQL не освобождаются HikariCP

Окружающая среда: Ubuntu 14.04.4

Приложение находится в разработке: Веб-приложение Spring 4.2.5.RELEASE MVC, MySQL с 151 + 1 MAX_CONNECTIONS, Hibernate, HikariCP в качестве источника данных с 20 подключениями на пул, 1 пул.

Инструмент автоматического развертывания: Jenkins

Контейнер развертывания: Tomcat 7

Предпосылки:
1. Приложение уже запущено и работает, доступно через Интернет.

Пример использования:
1. Войдите в командную строку mysql и выполните: show processlist;
2. Отметьте 20 подключений + 1 ваше в командной строке.
3. Инициируйте новое соберите Jenkins и подождите развертывания нового *.war на tomcat
4. выполнить: показать список процессов; в командной строке mysql
5. Наблюдайте 40 соединений + 1, ваше в командной строке.
6. Наблюдайте увеличение соединений до MAX_CONNECTIONS + 1, и после этого Jenkins не удается построить, потому что модульные тесты, требующие БД не работает.

Ожидаемое: не более 20 подключений в случае, когда к приложению осуществляется доступ, и вообще никаких подключений, если приложение находится в режиме ожидания (это поведение наблюдалось мной на моей локальной машине Windows 8.1 Pro для разработки)

Детали источника данных HikariCP:

@Bean
public LocalContainerEntityManagerFactoryBean getEntityManagerFactoryBean() {
    LocalContainerEntityManagerFactoryBean sessionFactory = new LocalContainerEntityManagerFactoryBean();
    sessionFactory.setDataSource(dataSource());
    sessionFactory.setPackagesToScan("com.myapp");

    HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    sessionFactory.setJpaVendorAdapter(vendorAdapter);
    sessionFactory.setJpaProperties(hibernateProperties());

    return sessionFactory;
}

private DataSource dataSource() {

    final HikariDataSource ds = new HikariDataSource();
    ds.setMaximumPoolSize(20);
    ds.setDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
    ds.addDataSourceProperty("url", "jdbc:mysql://localhost/myapp");
    ds.addDataSourceProperty("user", "usr");
    ds.addDataSourceProperty("password", "pwd");
    ds.addDataSourceProperty("cachePrepStmts", true);
    ds.addDataSourceProperty("prepStmtCacheSize", 250);
    ds.addDataSourceProperty("prepStmtCacheSqlLimit", 2048);
    ds.addDataSourceProperty("useServerPrepStmts", true);

    return ds;
}

private Properties hibernateProperties() {
    final Properties properties = new Properties();
    properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
    properties.put("hibernate.hbm2ddl.auto", "validate");
    properties.put("hibernate.implicit_naming_strategy", "legacy-jpa");
    return properties;
}

Кажется, что соединения не освобождаются даже после повторного развертывания приложения. Любые идеи?


person XMight    schedule 28.09.2016    source источник


Ответы (1)


В итоге сделал следующее:

public class MyLocalContainerEntityManagerFactoryBean extends LocalContainerEntityManagerFactoryBean {

public static final LoggerWrapper logger = new LoggerWrapper(MyLocalContainerEntityManagerFactoryBean.class);

@Override
public void destroy() {

    logger.warning("Destroying MyLocalContainerEntityManagerFactoryBean!");

    DataSource ds = getDataSource();
    if(ds instanceof HikariDataSource) {
        HikariDataSource hds = (HikariDataSource)ds;

        logger.warning("Closing the Hikari data source!");
        hds.close();
    }

    super.destroy();
}

}

Теперь все работает как положено, даже после нескольких действий по развертыванию/повторному развертыванию!

person XMight    schedule 29.09.2016