2014-11-10 2 views
0

DataSource를 통해 JDBC 연결에 액세스하는 간단한 DAO가 있습니다.Java EE 6 JDBC 연결 stickyness

상위 비즈니스 EJB 내에서 operation1()과 operation2()를 모두 호출 할 때 실제로 풀이 크기 때문에 호출 볼륨이 큰 경우 성능 문제를 일으키는 것으로 보이는 풀에서 두 개의 연결을 실제로 사용합니다.

1) 내가 사용하는 연결은 컨테이너 관리이어야합니다. 따라서 EntityManager의 연결을 해제하는 것은 옵션이 아닙니다.

2) 후드 아래에서 EclipseLink가 사용되고 있습니다.

JDBC 처리로 상위 비즈니스 EJB를 오염시키지 않고 어떻게 단일 연결을 얻을 수 있습니까?

@Stateless 
public class MyDAO { 
    @Resource(name = "jdbc/bla") 
    private DataSource ds; 

    public void operation1() { 
     try (
      Connection connection = ds.getConnection(); 
      CallableStatement cs = connection.prepareCall(xxx);) { 

     } 
     ... 
    } 
    public void operation2() { 
     try (
      Connection connection = ds.getConnection(); 
      CallableStatement cs = connection.prepareCall(yyy);) { 

     } 
     ... 
    } 

답변

1

변경 :

@Resource(name = "jdbc/bla") 
private DataSource ds; 

에 :

@PersistenceContext(unitName = "myPU") 
private EntityManager em; 

그런 다음에 "myPU을"지도 당신의 persistence.xml에서 JTA 데이터 소스를 정의합니다. JTA 데이터 소스는 JDBC 연결 풀을 가리키는 JDBC 리소스에 매핑되어야합니다. JDBC 자원과 JDBC 연결 풀은 모두 EE6 응용 프로그램 서버에서 구성됩니다.

이 설정을 사용하면 데이터 소스에 연결 풀링이 생기며 부모 EJB 메서드에서 operation1()operation2()을 호출하면 동일한 연결/트랜잭션의 일부가됩니다.

+0

감사합니다. 하지만 어떻게 불쾌한 entityManager.unwrap (java.sql.Connection.class)없이 기본 JDBC 연결을 얻을 수 있습니까; 그런 다음 트랜잭션을 수동으로 처리해야합니다. – rjdkolb

+0

호기심 때문에 왜 원시 연결이 필요한지 자세히 설명해 주시겠습니까? 그러면 도움이 될 것입니다. 또한, JTA 데이터 소스를 사용하고 있다면 그것을 풀 때 JPA와 같은 TX 컨텍스트에있게 될 것입니다 - 그것은 JTA 데이터 소스 자원을 사용하고 주입했을 때와 동일한 행동입니다. 필자는 개인적으로 이것을 테스트하지는 않았지만 읽지 않은 JTA 연결을 사용하거나 EE6의 CMT EJB에 JTA 데이터 소스를 주입하면 여전히 CMT를 얻을 수 있으며 TX를 수동으로 시작/커밋 할 필요가 없다고 생각합니다. – NBW

+0

Java EE 6을 사용하고 있으며 복잡한 Oracle 저장 프로 시저를 호출해야합니다. 그 쪽이 맞는 거 같아요. 나는 EclipseLink 문서를 두 번 확인했다. JTA가 아니라면 트랜잭션 관리 만하면됩니다. 내가 확인하게 해줘. 고마워요 http://bit.ly/1zgogOA – rjdkolb