2014-09-19 4 views
2

, 여기 관리 다중 데이터베이스 연결

이 시나리오는 다음과 같습니다 나는 여러 데이터베이스가 내 각 고객에 대해 하나, 같은 구조 모두 (같은 테이블 및 컬럼), 그래서 내 응용 프로그램은 런타임에 어느 것이 연결해야하는지 결정할 필요가있다. JPA2, EclipseLink 및 EJB3을 사용하고 있습니다.

첫 번째 시도는 올바른 데이터베이스에서 작업을 수행하는 모든 로직을 가진 사용자 지정 EntityManager를 구현 한 다음이 EntityManager를 Stateless EBJ로 구성하여 @EBJ 주석을 삽입 할 수있게했습니다 (이 링크에 설명 된대로 : http://www.hostettler.net/blog/2012/11/20/multi-tenancy/). EntityManager를 삽입하려고 시도 할 때 예외가 발생했기 때문에 제대로 작동하지 않습니다. 그것은 바로 데이터베이스에 연결할 수 있도록

그래서 나는 다른 무언가를 시도하기로 결정, (후 하나가 사용하는 런타임시 결정) 난의 EntityManagerFactory를 만든 나는 그것에 JTA_DATASOURCE을 통과시켰다. 여기

코드입니다 :

@Stateless 
@TransactionManagement(TransactionManagementType.CONTAINER) 
public class TestEntDAO { 

    private EntityManager em; 
    private EntityManagerFactory emf; 

    @PostConstruct 
    public void init() { 
     em = getEntityManager(); 
    } 

    public EntityManager getEntityManager() { 
     Map props = new HashMap(); 
     props.put(PersistenceUnitProperties.TRANSACTION_TYPE, "JTA"); 
     props.put(PersistenceUnitProperties.JTA_DATASOURCE, dataSourceName()); 
     emf = Persistence.createEntityManagerFactory("testePU", props); 
     em = emf.createEntityManager(); 
     return em; 
    } 

    public String dataSourceName(){ 
     if(someCondition){ 
      return "db1"; 
     }else{ 
      return "db2"; 
     } 
    } 
} 

이것은 완벽하게 작동, 유일한 문제는 트랜잭션이 컨테이너에 의해 관리되지 않는 것입니다, 그래서 내가 가진 명시 적으로 표시 트랜잭션의 경계 ((시작) 호출 및 commit()). @PersistenceContext 어노테이션을 사용하여 작동하게 할 수는 있지만, 에는 데이터 소스를 전달하는 EntityManagerFactory가 없습니다.

누구나 컨테이너 관리 트랜잭션 (CMT)을 사용하는 방법을 알고 있고 이 데이터 소스를 전달할 수 있습니까?

+0

왜 데이터 소스 이름을 삽입 할 수 없습니까? 또는 속성 파일에서 읽으시겠습니까? –

+0

나는 그것을 할 수있는 방법을 찾지 못했고 동시에 @PersistenceContext를 사용했다. –

답변

0

3 개의 데이터 소스와 3 개의 지속성 단위를 정의하려고 시도했을 수 있습니다.

<persistence-unit name="PU1"> 
    <jta-data-source>jdbc/DS1</jta-data-source> 
    ... 
</persistence-unit> 
<persistence-unit name="PU2"> 
    <jta-data-source>jdbc/DS2</jta-data-source> 
    ... 
</persistence-unit> 
<persistence-unit name="PU3"> 
    <jta-data-source>jdbc/DS3</jta-data-source> 
    ... 
</persistence-unit> 

원하는 Persistence 유닛에서 Entity manager를 삽입하십시오.

@PersistenceContext(unitName = "PU2") 
EntityManager em; 

테스트하지는 않았지만 정상적으로 작동합니다.

+0

나는 이것을 사용해 보았는데, 효과가 있었다. 그러나 연결 중 하나가 실패하면 애플리케이션이 배포되지 않는다. –

+0

어쩌면 극복 할 수 있습니다. 어떤 종류의 오류가 있었습니까? – zbig

+0

이와 비슷한 것 -> 내부 예외 : java.sql.SQLException : 연결 할당 오류. 원인 : 연결 시도가 실패했기 때문에 연결을 할당 할 수 없습니다. –

관련 문제