문제

일반적으로 DAO를 정의할 때 DAO 개체에 데이터 소스에 대한 설정자가 있습니다.내 문제는 우리의 데이터 소스가 서버에 대한 요청에 따라 동적으로 변한다는 것입니다.즉.모든 요청은 다른 데이터베이스 인스턴스에 액세스할 수 있습니다.

요청에는 나중에 요청 DB에 대한 연결을 검색하는 데 사용할 수 있는 논리적 속성이 포함되어 있습니다.

따라서 DAO를 비즈니스 로직 개체에 종속성 주입할 때 런타임(구성 시간이 아님)에 DAO의 속성을 설정하는 방법이 필요합니다.

한 가지 해결책은 스레드 로컬에 데이터 소스를 저장하는 것입니다. 그러나 저는 스레드 로컬 변수를 조작하는 것을 별로 좋아하지 않습니다.

또 다른 옵션은 요청 속성을 사용하여 DAO에서 초기화를 호출하는 비즈니스 논리 개체에 초기화 메서드를 두는 것입니다.

일반적인 문제인 것 같은데, 일반적인 해결책을 제안해 주실 수 있나요?

도움이 되었습니까?

해결책

문제는 응용 프로그램을 위해 단일 DAO 인스턴스를 작성한다는 것 같습니다. 각 데이터 소스에 대해 별도의 인스턴스를 만들어야합니다 (아마도 모든 것을 관리하기 위해 DAO 컨트롤러를 만들 수 있음) 또는 DAO의 메소드가 정적으로 정적이며 데이터 소스에 연결하는 방법에 대한 모든 정보를 전달할 수 있습니다. 모든 방법에 지속되는 데이터.

다른 팁

당신의 문제는 약간 혼란 스럽습니다. 하나의 DAO 액세스가 여러 가지 다른 데이터 소스를 갖는 것은 유지 보수 악몽처럼 보입니다. 결과적으로 호출하려는 모든 메소드가 포함 된 하나의 DAO 인터페이스를 정의해야합니다. 연결하는 각 데이터베이스에 대해 DAO 인터페이스를 구현하는 새로운 클래스를 구성합니다. 이를 통해 여러 구현이 가능합니다. 그런 다음 이러한 구현 (자체 데이터 소스가있는 각각)을지도 (Java.util.map)에 저장하여 "논리적 특성"을 맵의 키로 사용합니다. 모든 DAO 구현이 인터페이스를 구현하므로 인터페이스를 인터페이스로 캐스팅하여 상호 교환 적으로 사용할 수 있습니다. 비즈니스 객체에서 DAO 구현 맵을 주입합니다. 이것이 당신의 디자인에 도움이되기를 바랍니다.

이 수업을 살펴보고 싶을 수도 있습니다.

http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSource.html

이렇게 하면 서비스 객체와 데이터 액세스 객체가 동적 데이터 소스에 대한 개념이 존재한다는 사실을 더 쉽게 인식할 수 있습니다.

일반적으로 AbstractRoutingDataSource에서 사용하는 DataSourceLookup 구현이 반환되는 DataSource를 지정하는 요청 매개변수에 쉽게 액세스할 수 있도록 서블릿 필터를 구현하고 ThreadLocal을 사용해야 합니다.이를 정말로 피하고 싶다면 요청 범위 빈에 속성을 설정하는 서블릿 필터를 구현하고 작성한 DataSourceLookup 구현에 해당 빈을 주입할 수 있습니다.요청 범위 Bean은 구현에서 여전히 ThreadLocal을 사용하지만 적어도 이 방식은 사용자의 것이 아닌 Spring의 impl이므로 걱정할 필요가 없습니다.:)

유사한 접근 방식이 Spring 팀의 이 블로그 항목에 자세히 설명되어 있습니다.

http://blog.springsource.com/2007/01/23/dynamic-datasource-routing/

클라이언트/서버 프로젝트에서 그런 문제가있었습니다. 클라이언트 및 서버 프로젝트는 DAO 인터페이스를 공유하고있었습니다. 그리고 데이터베이스 작업을 수행했을 때 적절한 DAO 구현을 선택해야했습니다. 내 해결책은 다음과 같습니다.

IVehicleDao vehicleDao =daoFactory.Get<IVehicleDao>(parameters);
vehicleDao.doSomething();

매개 변수를 전달하여 공장에서 DAO를 얻습니다. Inside Dao Factory는 반품 할 DAO 구현을 결정합니다 ..

나는 이미 이것을했다. 각 클래스 각 클래스 하나를 만들어야하며 DAO의 범위에서 DataSource와 Dao에게 동적 호출을하는 클래스 컨트롤러를 통과해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top