, 여기 관리 다중 데이터베이스 연결
이 시나리오는 다음과 같습니다 나는 여러 데이터베이스가 내 각 고객에 대해 하나, 같은 구조 모두 (같은 테이블 및 컬럼), 그래서 내 응용 프로그램은 런타임에 어느 것이 연결해야하는지 결정할 필요가있다. 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)을 사용하는 방법을 알고 있고 이 데이터 소스를 전달할 수 있습니까?
왜 데이터 소스 이름을 삽입 할 수 없습니까? 또는 속성 파일에서 읽으시겠습니까? –
나는 그것을 할 수있는 방법을 찾지 못했고 동시에 @PersistenceContext를 사용했다. –