2009-05-13 5 views
14

나는 Spring MVC 2.5와 Hibernate를 사용하는 웹 애플리케이션을 만들고있다.다중 데이터 소스를 사용하는 Hibernate + Spring?

응용 프로그램의 요구 사항 중 하나는 일부 개체를 외부 데이터베이스로 내보낼 수 있어야한다는 것입니다. 기존 데이터 레이어를 사용하고 개체를 외부 소스에 저장할 수도 있습니다.

저는 Spring과 Hibernate를 처음 접했고, 어떻게 접근해야하는지 궁금합니다. 현재 모든 것은 주석을 통해 자동으로 연결됩니다. 나는

  1. 난 단지 외부 데이터에 대한 연결을 원하는 ... 나는 어쩌면 새로운은 dataSource 빈, 새로운 sessionFactory에, 그리고의 transactionManager를 ... 만들어야 추측 ...하지만 해요 사용자가 특별히 "내보내기"할 때 사용할 수있는 소스.

  2. 자동 배선이 진행 중입니까? 내 내보내기 프로세스를 위해 DAO를 인스턴스화 할 때 Spring에 적절한 sessionFactory를 주입하도록 어떻게 말할 수 있습니까? (나는 생성자를 통해 autowiring을하고있다.) 프로그래밍 방식으로 세션 팩토리 (etc)를 생성하고 수동으로 DAO를 인스턴스화해야 하는가? 그렇다면 autowire 주석을 "오버라이드 (override)"할까요?

누군가가 그냥 작동이 뭔가를 얻기의 기본 과정을 통해 나를 단계 수 특별히 만약 내가 위의 질문에 대한 답변을 필요로하지 않는 것 같아요. 감사!

+0

이 질문은이 문서와 매우 비슷합니다. http://stackoverflow.com/questions/281247/nhibernate-one-base-class-sealth-mappings –

답변

8

봄 컨텍스트에서 여러 데이터 소스와 세션 팩토리를 구성하는 것은 그 자체로 문제가되지 않지만 자동 와이어링을 덜 매력적으로 만듭니다.

당신이 선택할 수있는 하나를 autowiring을 이야기하는 @Qualifier 주석을 사용할 수 있습니다,하지만 난에서 autowiring을 사용하는 대신 명시 적으로 <property> 또는 <constructor-arg>을 사용하여 올바른 데이터 소스 및 세션 공장을 주입하지 좋을 것.

두 데이터 소스가 모두 앱 서버에서 관리하는 경우 트랜잭션 관리자가 두 데이터 소스간에 공유 될 수 있지만 두 데이터 소스에서 트랜잭션 무결성이 필요없는 것처럼 들리면 별도의 트랜잭션 각 데이터 소스가 충분할 것입니다.

+0

어떻게 두 데이터 소스간에 트랜잭션 관리자를 공유하겠습니까? SessionFactory 또는 이와 비슷한 목록을받는 설정자가 표시되지 않습니다. –

+0

@NieldeWet : 다중 데이터 소스 트랜잭션은 완전히 다른 볼 게임입니다. 분산 트랜잭션은 어렵습니다. 이를 위해서는 JavaEE에서 JTA 구현의 모든 기능이 필요하며, Spring의 JtaTransactionManager를 사용하여 앱과 통합하십시오. – skaffman

24

봄에는 다행스럽게도 이미 Spring에 대한 솔루션 인 AbstractRoutingDataSource가 있습니다. 그것은 기본적으로 여러 DataSource의 Facade로 작동하며 하위 클래스로 사용하고 어떤 DataSource를 사용해야하는지 결정하는 데 필요한 논리를 구현할 수 있습니다. 일부 세부 사항은 여기에 있습니다 :

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

이것은 당신의 데이터 소스 조회 논리는 정확히 한 곳에서 처리 할 수 ​​있습니다. DAO 레이어와 SessionFactory는 조정할 필요가 없다. 단, AbstractRoutingDataSource의 서브 클래스를 Hibernate SessionFactory에 삽입해야한다.

+0

런타임에 활성 데이터 소스가 하나만있는 경우이 방법이 적합합니까?우리의 경우에는 서로 다른 클라이언트에 대해 2 dbms를 지원하지만 각각 하나의 서버 만 지원합니다. –

+1

아마도 아닙니다. JDBC PropertyPlaceholderConfigurer를 통해 JDBC URL을 설정하고자 할 것입니다. 속성 파일이나 환경 변수에서 읽을 수도 있습니다. –

+0

그것은 결국 내가 한 일입니다. 어떤 bean이 데이터 소스로 사용되었는지를 선택하기 위해 사용 된 속성을 지정했습니다. 나는 그것을 배치했다 [여기] (http://stackoverflow.com/questions/23915154/using-sqlserverconnectionpooldatasource-in-spring/23993098#23993098) –

관련 문제