2013-10-17 2 views
0

Struts 2를 사용하여 Java 웹 응용 프로그램을 만들고 있습니다. 현재 각 페이지가로드 될 때마다 새 db 연결을 설정 한 다음 요청이 끝날 때이 db 연결을 닫습니다. 결과 HTML을 렌더링하기 직전에. 따라서 각 요청은 고유 한 db 연결을 갖습니다.Java에서 정적 메서드로 데이터베이스 연결을 공유합니다.

내 모델 클래스 내에서 주어진 사용자 ID가 존재하면 true를 반환하는 User.exists(id)과 같이 많은 정적 메소드를 갖고 싶습니다. 그렇지 않은 경우 false를 반환합니다. 또는 User.getEmail(id) 또는 User.disable(id)과 같은 다른 유틸리티 메소드.

제 질문은 이러한 정적 메서드로 db 연결을 공유하는 편리한 방법이 있습니까? 이러한 모든 방법에 대한 두 번째 인수 (예 : User.exists(id, db))로 연결을 전달해야하는 것은 추악하고 너무 편리하지 않습니다.

각 유틸리티 메서드에서 새 db 연결을 얻은 다음 결과를 반환하기 전에 닫으면 어떨까요? 성능에 어떤 영향을 미칩니 까? 나는 요청 내에서 (사용자 입력의 유효성을 검사 할 때와 같이) 몇 번이나 이러한 메소드를 20-30 번 호출해야 할 수도있다.

+1

DB 연결이 완전히 스레드 안전 인 경우에만 가능합니다. 연결 풀을 사용하십시오. – SLaks

+0

@SLaks 각 페이지 요청을 시작할 때 struts에 의해 호출되는 struts 인터셉터를 사용하고 있습니다. db 연결은 인터셉터의'intercept()'메소드 내에서 이루어지며 요청이 렌더링을 완료했음을 알고있는 동일한 메소드에서 또한 닫힙니다. 그래서 나는 스레드 측에서 안전하다고 생각합니다. 내 관심사는 각 정적 유틸리티 메서드 내에서 새 연결을 만드는 것입니다. 그 성능에 영향을 미칠까요? –

+0

JEE 응용 프로그램 서버를 사용하는 경우 연결 풀링 기능을 사용하십시오. 그런 다음 OSIV 인터셉터를 구현할 수 있습니다.이 인터셉터는 Spring/hibernate를 사용하면 트랜잭션 세션을 설정하는 작업 만 필요합니다. 트랜잭션 세션은 인터셉터가 풀릴 때만 닫히지 만 DB 액세스가 필요하지 않으면 db에 대한 실제 연결을 여는 데 시간을 소비하지 않습니다. – Quaternion

답변

1

예, 가능합니다. 각 스레드가 고유 한 연결을 원할 경우에는 각 요청이 자체 스레드를 생성하므로 ThreadLocal을 사용해야합니다. 요청이 끝나면 연결을 종료하기 만하면됩니다. 이는 Filter을 사용하여 이루어집니다.

필터는 요청이 끝날 때 연결이 닫히지 않도록 다른 필터보다 먼저 있어야합니다.

DBUtil :

public class DBUtil { 

    private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>(); 

    public static Connection getConnection() { 
     Connection connection = connectionHolder.get(); 
     if (connection == null) { 
      //open the connection (lazy loaded) 

      //store it 
      connectionHolder.set(connection); 

     } 
     return connectionHolder.get(); 
    } 

    public static void close() { 
     Connection connection = connectionHolder.get(); 
     if (connection != null) { 
      //close the connection 

      //remove it from the connection holder 
      connectionHolder.remove(); 
     } 
    } 

} 

DBFilter :

public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain chain) throws IOException, ServletException {  
    try { 
     chain.doFilter(request, response); 
    } finally { 
     DBUtil.close();   
    } 
} 

당신이 예를 Spring Framework 위해 이미 서비스하고 프록시하여이 작업을 수행 사물의 이러한 종류의 프레임 워크를 사용하는 경우가 더 낫다 연결을 처리하고 트랜잭션은 또한 많은 다른 기능을 제공합니다.

+0

흥미롭게도 ThreadLocal db connection을 가질 수 있다고 말했고'Db.getConnection()'을 호출 할 때마다 현재 요청에 대해서만 유일한/로컬 db 연결을 리턴 할 것입니까? 그렇다면 필터를 구현하는 방법에 대해 좀 더 자세히 설명해 주시겠습니까? 그런 다음 받아 들일 수 있습니다. –

+0

@ClickUpvote done. 어쨌든 Spring과 같은 좀 더 완벽한 것을 사용하는 것이 좋습니다.이 기능은 트랜잭션 기능을 제공하므로 직접 만들 필요가 없습니다. –

+0

감사합니다. Struts에 익숙합니까?Struts 2는 thread safe 인 것으로 보이는'ActionContext'를 가지고 있습니다. –

관련 문제