【问题标题】:Jenkins at deploy of a SpringMVC JPA webapp MySQL connections not freed HikariCPJenkins 在部署 SpringMVC JPA webapp MySQL 连接未释放 HikariCP
【发布时间】:2017-02-06 17:38:49
【问题描述】:

环境: Ubuntu 14.04.4

应用开发细节: Spring 4.2.5.RELEASE MVC webapp,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 无法构建,因为需要 DB 的单元测试失败。

预期: 访问应用时最多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;
}

似乎连接没有释放,即使在重新部署应用程序之后也是如此。有什么想法吗?

【问题讨论】:

    标签: java mysql spring jenkins hikaricp


    【解决方案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();
    }
    

    }

    现在一切都按预期工作,即使经过多次部署/重新部署操作!

    【讨论】:

      猜你喜欢
      • 2019-12-03
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      • 2019-07-13
      • 2013-05-09
      • 1970-01-01
      • 2019-05-09
      • 2020-03-15
      相关资源
      最近更新 更多