[SPRING] JNDI에서 얻은 데이터 소스를 닫아야합니까?
SPRINGJNDI에서 얻은 데이터 소스를 닫아야합니까?
업데이트 : 분명히 7.0.11부터 시작하는 Tomcat이 DataSource를 닫습니다. 따라서 webapp의 contextDestroyed에서는 사용할 수 없습니다. 참조 : https://issues.apache.org/bugzilla/show_bug.cgi?id=25060
안녕하세요,
Spring 3.0과 Java 1.6을 사용하고 있습니다.
이런 방식으로 데이터 소스를 얻는다면 :
<bean id="dataSource" class="my.data.Source" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:home"/>
<property name="username" value="user"/>
<property name="password" value="pw"/>
</bean>
빈이 파손되면 데이터 소스가 닫힙니다.
다음과 같은 데이터 소스를 얻는다면 :
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/db" />
그럼 내 contextDestroyed 리스너에서 명시 적으로 데이터 소스를 닫아야합니까?
감사,
폴
해결법
-
==============================
1.나는 동의하지 않는다. 나는 당신의 web.xml에 리스너를 추가하고 contextDestroyed () 메소드를 구현할 것이다. 이 메소드는 웹 애플리케이션이 파괴되거나 배포 해제 될 때 웹 컨테이너 / 앱 서버에 의해 호출됩니다. contextDestroyed () 내에서 데이터 소스를 닫습니다.
나는 동의하지 않는다. 나는 당신의 web.xml에 리스너를 추가하고 contextDestroyed () 메소드를 구현할 것이다. 이 메소드는 웹 애플리케이션이 파괴되거나 배포 해제 될 때 웹 컨테이너 / 앱 서버에 의해 호출됩니다. contextDestroyed () 내에서 데이터 소스를 닫습니다.
web.xml 내부
<listener> <listener-class>util.myApplicationWatcher</listener-class> </listener>
코드:
package util; public class myApplicationWatcher implementes ServletContextListener { public void contextInitialized(ServletContextEvent cs) { // This web application is getting started // Initialize connection pool here by running a query JdbcTemplate jt = new JdbcTemplate(Dao.getDataSource() ); jt.queryForInt("Select count(col1) from some_table"); } public void contextDestroyed(ServeletContextEvent ce) { // This web application is getting undeployed or destroyed // close the connection pool Dao.closeDataSource(); } } public class Dao { private static DataSource ds; private static bDataSourceInitialized=false; private static void initializeDataSource() throws Exception { InitialContext initial = new InitialContext(); ds = (DataSource) initial.lookup(TOMCAT_JNDI_NAME); if (ds.getConnection() == null) { throw new RuntimeException("I failed to find the TOMCAT_JNDI_NAME"); } bDataSourceInitialized=true; } public static void closeDataSource() throws Exception { // Cast my DataSource class to a c3po connection pool class // since c3po is what I use in my context.xml ComboPooledDataSource cs = (ComboPooledDatasource) ds; // close this connection pool cs.close(); } public static DataSource getDataSource() throws Exception { if (bDataSourceInitialized==false) { initializeDataSource(); } return(ds); } }
-
==============================
2.여기서 DataSource는 원격 JNDI 컨테이너에 의해 관리되며 DataSource의 라이프 사이클을 관리하는 것은 해당 컨테이너의 작업입니다. 봄은 그것을 사용하고 관리하지 않습니다.
여기서 DataSource는 원격 JNDI 컨테이너에 의해 관리되며 DataSource의 라이프 사이클을 관리하는 것은 해당 컨테이너의 작업입니다. 봄은 그것을 사용하고 관리하지 않습니다.
원한다고해도 DataSource에는 close () 메소드 또는 이와 유사한 메소드가 없습니다.
-
==============================
3.JNDI 조회를 통해 데이터 소스를 얻으면 공유 리소스가 컨테이너에 구성됩니다. 응용 프로그램이 아니라 컨테이너가 관리하므로 컨테이너를 닫을 필요는 없습니다 (방법이 없습니다).
JNDI 조회를 통해 데이터 소스를 얻으면 공유 리소스가 컨테이너에 구성됩니다. 응용 프로그램이 아니라 컨테이너가 관리하므로 컨테이너를 닫을 필요는 없습니다 (방법이 없습니다).
from https://stackoverflow.com/questions/5407525/should-i-close-jndi-obtained-data-source by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 봄 / 최대 절전 모드로 사립 멤버에 액세스 할 수 있습니까? (0) | 2019.04.19 |
---|---|
[SPRING] 스프링 부트 스타터 상위 2.0.0 종속성을 찾을 수 없음 (0) | 2019.04.19 |
[SPRING] 스프링 데이터 MongoDB와 함께 낙관적 인 잠금을 사용하는 방법? (0) | 2019.04.19 |
[SPRING] WebMvcConfigurationSupport없이 Spring HandlerInterceptor 등록하기 (0) | 2019.04.19 |
[SPRING] @Valid 유효성 검사에서 일부 필드 제외 (0) | 2019.04.19 |