gpt4 book ai didi

java - Jenkins 在部署 SpringMVC JPA webapp MySQL 连接时未释放 HikariCP

转载 作者:行者123 更新时间:2023-11-29 20:16:28 24 4
gpt4 key购买 nike

环境: 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 无法构建,因为需要数据库的单元测试失败。

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

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

最佳答案

最终执行了以下操作:

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();
}

}

现在一切都按预期工作,即使在多次部署/重新部署操作之后也是如此!

关于java - Jenkins 在部署 SpringMVC JPA webapp MySQL 连接时未释放 HikariCP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39752612/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com