2016-09-28 6 views
0

환경 : 우분투 개발 세부 14.04.4젠킨스 HikariCP를 해제하지 않는 SpringMVC JPA 웹 애플리케이션 MySQL의 연결의 배포에

응용 프로그램 : 봄 4.2.5.RELEASE MVC 웹 애플리케이션, MySQL은 151 + 1 MAX_CONNECTIONS와 , Hibernate, HikariCP, 풀당 20 ​​개의 연결, 1 개의 풀을 가진 데이터 소스.

자동 배포 도구 : 젠킨스

배포 용기 : 톰캣 7

전제 조건 :
1. 응용 프로그램이 이미 시작하고 웹을 통해 액세스, 작업.

사용의 경우 :
1. 로그인 MySQL의 명령 행 실행에 : 쇼 PROCESSLIST;
2. 명령 줄에서 20 개의 연결 + 1을 관찰합니다.
3. Jenkins에서 새 빌드를 트리거하고 새 * .war을 tomcat에 배포 대기
4. 다음을 실행합니다. show processlist; mysql 커맨드 라인
5. 커맨드 라인에서 40 개의 접속 + 1을 관찰하라.
6. 연결이 MAX_CONNECTIONS + 1까지 증가하는 것을 관찰하면 DB를 필요로하는 유닛 테스트가 실패하기 때문에 Jenkins가 빌드에 실패합니다.

예상 : 응용 프로그램이

(이것은 내 지역 개발 윈도우 8.1 프로 기계 날에 의해 관찰 된 동작입니다) 유휴 모든 경우에서 20 개 응용 프로그램에 액세스 할 경우 최대 연결없이 연결

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

}

이제 모든 것이 예상대로도 여러 배포 한 후, 작동/재 구축 작업을!