2013-02-26 1 views
2

많은 코더 ' 손을 통과 한이 프로젝트를 진행 중입니다. 응용 프로그램은 웹과 일괄 처리의 두 부분으로 구성됩니다. 웹 파트는 사용자가 일부 구성을 설정하기위한 기본 UI를 제공합니다. JDBC/JNDI/non-Spring을 사용하고 DAO는이를 기반으로 작성되었습니다.javax.sql.Datasource 객체의 단일 인스턴스를 캐시하는 것이 좋은 생각입니까?

배치 부분은 PDF, PostScripts, XML 등과 같은 파일을 생성합니다.이 비트는 JDBC/Spring을 사용하고 DAO는이를 기반으로 작성되었습니다.

이제 코드베이스는 하나 뿐이지 만 코드는 여러 폴더 또는 모듈 (웹 (war 파일), 일괄 처리 (java 응용 프로그램 .bat 또는 .sh) 및 Commons (jar 파일))로 구분됩니다. Web과 Batch 모두 동일한 Commons jar 파일을 사용하지만 DAO는 조각화되어있어 웹과 배치에 배포 된 코드에서 모두 사용할 수있는 공유 DAO를 가진 새로운 모듈을 작성하기가 어렵습니다.

이 프로젝트를 상당히 오랜 기간 지원할 예정이므로 개선 작업을 시작하기로했습니다. 무엇보다도 새로운 모듈은 기존의 깨지기 쉬운 코드를 사용하기 위해 DAO와 오래된 모듈의 통일 된 집합을 사용합니다.

아래에서 com.abc.core2.dao.ABCDAO는 DataSource의 단일 인스턴스에 대한 참조를 보유하고 데이터베이스에서 연결을 가져 오기 위해 웹 또는 일괄 처리에서 을 사용합니다. DataSource 객체는 각 모듈의 핵심 DAO에서 가져와 ABCDAO.dataSource 인스턴스 변수에 캐시합니다.

누구나 전에 이렇게 해본 적이 있습니까? 응용 프로그램을 다시 시작할 때까지 단일 DataSource 객체를 유지하는 데 문제가 있습니까?

변경 사항은 여전히 ​​프로토 타입입니다. 내 의뢰인은 다른 사람들에게 간단한 변경을 아웃소싱했습니다.

공통 (jar 파일)

package com.abc.core2.dao; 
public class ABCDAO { 
    private static ABCDAO abcdao = new ABCDAO(); 
    private DataSource dataSource; 
    public void setInternalDataSource(DataSource dataSource) {this.dataSource = dataSource;} 
    public DataSource getInternalDataSource() { return this.dataSource; } 
    public static ABCDAO getInstance() { return this.abcdao; } 
    ... 
} 
public class NewModuleJdbcDao implements NewModuleDAO { 
    ... 
    public List<XYZBean> getXYZ(SearchBean sb) { 
     Connection con = ABCDAO.getInstance().getInternalDataSource().getConnection(); 
     ... 
     con.close(); 
     return listOfXYZBeans; 
    } 
} 

일괄 적용

import com.abc.core2.dao.ABCDAO; 
public abstract InformixBaseDAO extends ABCBaseDAO { 
    { 
     // via Spring JDBC XML configuration 
     ABCDAO.getInstance().setDataSource(NewConnectionPooler.getInstance().dataSource()); 
    } 
    public Connection getConnection() throws SQLException { 
     // pre-existing method. It does NewConnectionPooler.getInstance().getConnection() 
     ... 
     return connection; 
    } 
} 

// Use same NewModuleJdbcDao in Web application 
public class NewModuleClass001 { 

    public void show(SearchBean bean) { 
     ... 
     NewModuleJdbcDao dao = new NewModuleJdbcDao(); 
     List<XYZBean> list = dao.getXYZ(bean); 
     ... 
    } 
} 

웹 응용 프로그램

import com.abc.core2.dao.ABCDAO; 
public class DBConnection { 
    private static DataSource dataSource = null; 
    { 
     if(dataSource == null) { 
      dataSource = ServiceLocator.getInstance().getDataSource(...); // via JNDI 
      ABCDAO.getInstance().setDataSource(dataSource); 
     } 
    } 
    public static Connection() { 

     // Spring JDBC 
     ... 
    } 
} 

// Use same NewModuleJdbcDao in Web application 
public class NewModuleClass001 { 

    public void show(SearchBean bean) { 
     ... 
     NewModuleJdbcDao dao = new NewModuleJdbcDao(); 
     List<XYZBean> list = dao.getXYZ(bean); 
     ... 
    } 
} 

답변

0

I 이 전략을 연습하는 데 항상 사용되며 해당 솔루션을 기반으로하는 문제에 익숙하지 않습니다. Spring을 사용하는 경우 풀링 된 데이터 소스를 응용 프로그램 범위의 단일 bean으로 정의하고이를 모듈에 삽입하십시오.

+1

저는 Spring과 약간 다른 OSGI를 사용하고 있습니다. 다른 Bean 컴포넌트간에 동일한 데이터 소스를 성공적으로 공유 할 수 있습니다. 나는 봄에도 괜찮다고 상상한다. – vikingsteve

관련 문제