【发布时间】: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