2014-12-28 4 views
5
final MyDAO dao = database.onDemand(MyDAO.class); 

dao 인스턴스를 다시 사용할 수 있습니까? 또는 매번 사용할 때마다 인스턴스화해야합니까?JDBI DAO 인스턴스를 재사용 할 수 있습니까?

코드에서 DB 트랜잭션을 관리하는 것처럼 보입니다. 그러나 DropWizard의 예는 다음과 같습니다. -

따라서 동일한 자원에서이 인스턴스는 모든 경로에서 재사용됩니다. 즉, 두 개의 요청이 동일한 리소스 (두 경로 일 수도 있음)를 만들면 두 DAO가 동일한 DAO 인스턴스를 사용하게됩니다. 문제가되지 않습니까?

답변

4

onDemand은 필요에 따라 자동으로 연결을 설정하고 해제합니다. 일반적으로 이것은 명령문을 실행하고 즉시 릴리스하는 연결을 얻음을 의미하지만 열린 트랜잭션 또는 반복기 기반 결과와 같은 여러 가지 사항은 트랜잭션이 완료되거나 반복 된 결과가 완전히 통과 될 때까지 연결을 열린 상태로 유지하게됩니다. 따라서 두 개의 요청이 동일한 리소스에 액세스하는 경우에도 다른 요청이 처리됩니다. 그래서 그것은 어떤 문제도 일으키지 않을 것입니다.

public abstract class Dao implements GetHandle { 

    public void printHandle() { 
     System.out.println(getHandle()); 
    } 

} 

@Test 
public void testHandle() { 
    Dao onDemandDao = dbi.onDemand(Dao.class); 
    Handle handle = dbi.open(); 
    Dao handleAttachedDao = handle.attach(Dao.class); 
    Dao openDao = dbi.open(Dao.class); 
    for(int i=0; i< 5; i++) { 
     onDemandDao.printHandle(); 
    } 
    for(int i=0; i< 5; i++) { 
     handleAttachedDao.printHandle(); 
    } 
    for(int i=0; i< 5; i++) { 
     openDao.printHandle(); 
    } 
} 

이 테스트에 대한 출력은,

[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 

당신이 볼 수있는, 온 디맨드 다오 매번 새로운 핸들 때 접근 방법을 만듭니다.

관련 문제