복붙노트

[SPRING] JNDI에서 얻은 데이터 소스를 닫아야합니까?

SPRING

JNDI에서 얻은 데이터 소스를 닫아야합니까?

업데이트 : 분명히 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. ==============================

    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. ==============================

    2.여기서 DataSource는 원격 JNDI 컨테이너에 의해 관리되며 DataSource의 라이프 사이클을 관리하는 것은 해당 컨테이너의 작업입니다. 봄은 그것을 사용하고 관리하지 않습니다.

    여기서 DataSource는 원격 JNDI 컨테이너에 의해 관리되며 DataSource의 라이프 사이클을 관리하는 것은 해당 컨테이너의 작업입니다. 봄은 그것을 사용하고 관리하지 않습니다.

    원한다고해도 DataSource에는 close () 메소드 또는 이와 유사한 메소드가 없습니다.

  3. ==============================

    3.JNDI 조회를 통해 데이터 소스를 얻으면 공유 리소스가 컨테이너에 구성됩니다. 응용 프로그램이 아니라 컨테이너가 관리하므로 컨테이너를 닫을 필요는 없습니다 (방법이 없습니다).

    JNDI 조회를 통해 데이터 소스를 얻으면 공유 리소스가 컨테이너에 구성됩니다. 응용 프로그램이 아니라 컨테이너가 관리하므로 컨테이너를 닫을 필요는 없습니다 (방법이 없습니다).

  4. from https://stackoverflow.com/questions/5407525/should-i-close-jndi-obtained-data-source by cc-by-sa and MIT license