[SPRING] 컨텍스트 언로드시 연결 풀을 종료하는 방법?
SPRING컨텍스트 언로드시 연결 풀을 종료하는 방법?
Spring, hibernate 및 c3p0과 connectionpool으로 비슷한 셋업을 가지고있는 여러 웹 어플리케이션을 개발 한 후에 매번 발견 한 문제를 조사하기를 원했습니다. Connectionpool은 Tomcat (또는 응용 프로그램 서버)을 종료 할 때까지 연결을 유지합니다.
오늘 저는이 네 가지 종속성으로 할 수있는 가장 기본적인 프로젝트를 만듭니다.
org.springframework:spring-web
org.springframework:spring-orm
org.hibernate:hibernate-core
c3p0:c3p0
(플러스 특정 JDBC 드라이버).
내 web.xml은 응용 프로그램 컨텍스트를 설정하는 ContextLoaderListener 만 만듭니다.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
응용 프로그램 컨텍스트는 두 개의 bean으로 구성됩니다 - datasource 및 session factory :
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass">
<value>org.postgresql.Driver</value>
</property>
<property name="jdbcUrl">
<value>jdbc:postgresql://localhost/mydb</value>
</property>
<property name="user">
<value>usr</value>
</property>
<property name="password">
<value>pwd</value>
</property>
</bean>
내가 webapp을 시작하고 jconsole의 MBean을 조사하거나 열려있는 연결에 대한 DBMS를 확인하면 c3p0에 의해 만들어진 세 개의 초기 연결을 확인할 수 있습니다.
문제 : 웹 응용 프로그램을 중지하도록 Tomcat에 요청하면 여전히 남아 있습니다!
contextDestroyed 메소드 만 구현하고 프로그래밍 방식으로 sessionFactory를 종료시키는 또 다른 ServletContextListener를 작성했습니다. 또한 자동으로 수행되지 않는 JDBC 드라이버의 등록을 취소합니다. 코드 :
@Override
public void contextDestroyed(ServletContextEvent sce) {
...
sessionFactory().close();
// deregister sql driver(s)
Enumeration<Driver> drivers = DriverManager.getDrivers();
while (drivers.hasMoreElements()) {
Driver driver = drivers.nextElement();
try {
DriverManager.deregisterDriver(driver);
log.info("deregistering jdbc driver: " + driver);
} catch (SQLException e) {
log.error("error deregistering jdbc driver: " + driver, e);
}
}
}
하지만 그게 진짜야? 내가 모르는 기본 제공 메커니즘이 있습니까?
해결법
-
==============================
1.파괴 방법을 지정하려고 했습니까?
파괴 방법을 지정하려고 했습니까?
<bean class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
from https://stackoverflow.com/questions/13532302/how-to-shutdown-connection-pool-on-context-unload by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring - 처리 후 모든 요청에 대한 헤더 수정 (postHandle에서) (0) | 2019.02.14 |
---|---|
[SPRING] Spring을 사용하여 JMS Listener 시작 및 중지 (0) | 2019.02.14 |
[SPRING] 스프링 EL 변수 목록 (0) | 2019.02.14 |
[SPRING] 봄 - intum 문자열로 열거 형을 저장 / 검색하는 몽고 (0) | 2019.02.14 |
[SPRING] 통합 테스트 케이스를 통한 스프링 부트, yml 속성 읽기 (0) | 2019.02.14 |