2010-06-21 4 views
4

SimpleJdbcTemplate 및 RowMapper 클래스를 사용하여 DAO 레이어와 함께 스프링 프레임 워크와 스프링 JDBC를 이미 사용하는 애플리케이션이 있습니다. 이것은 작은 클래스 구조가 데이터베이스에서 읽힐 때 아주 잘 작동하는 것처럼 보입니다. 그러나 다른 개체의 컬렉션을 보유하고있는 개체를로드해야합니다.이 개체는 다른 개체의 컬렉션을 계속 보유합니다.스프링 프레임 워크 JDBC DAO (agrgegation/composition)

이 문제에 대한 "분명한"해결책은 명명 된 RowMapper 클래스 또는 개체를 만들고 생성자의 적절한 DAO 개체에 대한 참조를 전달하는 것입니다. 예를 들어 :

public class ProjectRowMapper implements ParameterizedRowMapper { 

    public ProjectRowMapper(AccountDAO accountDAO,) { 
     this.accountDAO = accountDAO; 
    } 

    public Project mapRow(ResultSet rs, int rowNum) throws SQLException { 
     Project project= new Project(); 
     project.setProjecttId(rs.getString("project_id")); 
     project.setStartDate(rs.getDate("start_date")); 
     // project.setEtcetera(...); 

     // this is where the problems start 
     project.setAccounts(accountDAO.getAccountsOnProject(project.getProjectId())); 
    } 
} 

문제는 ProjectDAO 및 계정 DAO 점유율 동일한 데이터 소스 인스턴스가 (우리의 경우이 연결 풀이다), 모든 데이터베이스 액세스가 다른 연결을 통해 수행에도 불구하고 있다는 점이다. 객체 계층 구조적인 DataSource.getConnection()에 대한 프레임 워크에 의해 (A) 많은 호출이 구현 결과를 사용하여, 심지어는 세 가지 수준의 깊은 경우

및 (2) 더 나쁜, 우리는 연결의 수를 모자 때문에 다중 스레드가 데이터베이스에서 프로젝트를로드하려고 시도하는 동안 연결 풀에서 허용되는 경쟁 조건.

다른 본격적인 ORM 도구없이 Spring에서 더 좋은 방법으로 이러한 객체 계층 구조를로드 할 수 있습니까?

덕분에, 폴

+1

본격적인 ORM 도구는 여기에서 필요한 도구입니다. 이러한 문제는 어렵습니다. 재발견하지 마십시오. – skaffman

+1

코드 주위에 트랜잭션이 있습니까? 복잡한 객체를로드하는 데 동일한 중첩 된 DA 패턴을 사용하지만 Spring JDBC는 하나의 연결 만 사용합니다. – Serxipc

답변

2

난 당신이 이런 종류의 문제에 대한 이상적인 도구 인 ORM을 사용하지 않는 이유가있을 것 같아요.

다중 연결 문제는 다른 DAO에 대한 재귀 호출입니다. 추가 연결을 사용하지 않으려면 계정 인스턴스를 프로젝트 인스턴스를 가져온 후에 나중에 가져와야합니다. 프로젝트를 가져올 때 accountID도 가져 오지만 계정 인스턴스에 "인스턴스화"되지는 않습니다.이 ID는 ID 목록으로 유지되며 DAO 프로젝트가 완료된 후에 채워집니다.

예를 들어 ID 목록과 DAO 구현을 사용하는 사용자 지정 목록 형식을 만들 수 있습니다. 이 목록에는 ProjectRowMapper의 ID로 채워지고 프로젝트의 accounts 속성에 할당됩니다. ID는 목록의 비공개 항목입니다. 목록의 "내용"은 아니지만 나중에 실제 내용을 생성 할 수있는 방법입니다.

Project DAO가 RowMapper에서 프로젝트를 가져 오면 목록에 저장되어있는 ID에 대한 계정을 가져 오도록 지시 할 수 있습니다. 계정은 중첩되지 않은 작업으로 가져 오므로 전체 프로세스는 언제든지 하나의 연결 만 사용합니다. 그러나 가져 오기는 DAO 메서드의 범위 내에서 수행되므로 가져 오기가 열심히 수행되므로 지연 문제를 처리 할 필요가 없습니다.

+0

이것은 내가 한 일이며 훌륭하게 작동합니다. –

관련 문제