많은 코더 ' 손을 통과 한이 프로젝트를 진행 중입니다. 응용 프로그램은 웹과 일괄 처리의 두 부분으로 구성됩니다. 웹 파트는 사용자가 일부 구성을 설정하기위한 기본 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);
...
}
}
저는 Spring과 약간 다른 OSGI를 사용하고 있습니다. 다른 Bean 컴포넌트간에 동일한 데이터 소스를 성공적으로 공유 할 수 있습니다. 나는 봄에도 괜찮다고 상상한다. – vikingsteve