2016-09-28 4 views
0

環境: Ubuntuの開発詳細に14.04.4ジェンキンスHikariCPを解放しないSpringMVC JPA WebアプリケーションMySQL接続の展開に

アプリケーション:スプリング4.2.5.RELEASE MVCのWebアプリケーションは、MySQL 151 + 1つのMAX_CONNECTIONSと、Hibernate、HikariCP、プールごとに20個の接続、1つのプールを持つデータソース。

自動展開ツール:ジェンキンス

展開コンテナ:のTomcat 7

前提条件:
1.アプリケーションがすでに起動し、Webを介してアクセスでき、作業。

ユースケース:
1.ログインmysqlコマンドラインと実行へ:ショーPROCESSLIST。
2.コマンドラインで20個の接続+ 1を観察します。
3. Jenkinsで新しいビルドを開始し、新しい* .warをtomcatに展開するのを待ちます
4.実行:show processlist; mysqlコマンドラインで
5.コマンドラインで40個の接続+ 1を監視します。
6.接続がMAX_CONNECTIONS + 1まで増加していることを確認してください。その後、DBが必要なユニットテストが失敗するため、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; 
} 

接続がでも、アプリケーションの再展開した後、解放されていないようです。何か案は?次をやってしまった

答えて

0

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

}

期待通りに今すべてがさえ、いくつかの配備/再配備する行為の後、動作します!

関連する問題