2016-12-11 3 views
0

웹 응용 프로그램이 있습니다. Jersey를 사용하여 REST 웹 서비스를 구현했습니다. 그래서 내 컨트롤러는 Jersey ServletContainer 서블릿이고, 그것은 jar 파일 안에 패키지되어 있습니다. 이제 앱에 연결하고 API 끝점을 통해 DB에서 데이터를 가져 오는 n 명의 고객이 있다고 가정 해 보겠습니다. 모든 고객이 연결할 수있는 글로벌 연결 풀을 갖고 싶기 때문에 연결 생성 오버 헤드를 줄일 수 있습니다. 그래서 컨트롤러 서블릿의 init() 또는 contextInitialized() 메소드에 넣을 생각 이었지만 저어지 컨트롤러가 클래스 파일로 저지 용기에 이미 패키지되어 있기 때문에 그렇게 할 수 없습니다. 그래서 나는 문맥을 매번 만들지 않도록 문맥과 데이터 소스를 만드는 것을 처리하는 GenericConnection 클래스 내에 정적 블록을 만들어서 코드로 implemeneted했다.JDBC 연결 풀링의 이점

public class GenericConnection { 
    static DataSource dataSource; 
    Connection con; 

    static { 
     try{ 
      System.out.println("1 and thats all"); 
     Context initContext = new InitialContext(); 
     Context envContext = (Context)initContext.lookup("java:/comp/env"); 
     dataSource = (DataSource)envContext.lookup("jdbc/moodoff_notificationRead_DB"); 
     } 
     catch(Exception ee){ 
      ee.printStackTrace(); 
     } 
    } 
    // Get a connection from the connection pool 
    public Connection getNewConnection(){ 
     try { 
      con = dataSource.getConnection(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return con; 
    } 
} 

그러나 모든 사용자 요청에 대해 글로벌 풀을 만들고 거기에서 연결을 공유 할 수 있는지 여부는 확실하지 않습니다. 의도적으로 정적 블록을 만들고 그 안에 모든 것을 넣으면 초기화가 한 번만 수행됩니다. 정말 내가 원하는 것을 이루는데 도움이 될까요? 그리고 내가 할 수있는 다른 튜닝이 있다면. 미리 감사드립니다 !!

+0

예, 도움이됩니다. 하지만 코드는 스레드로부터 안전하지 않습니다. Connection은 getNewConnection()의 ** local ** 변수 여야합니다. 그리고 왜'getNewConnection()'이 정적이지 않은지 나는 정말로 알지 못합니다. 그리고 예외를 포착하고 무시해서는 안됩니다. –

+0

@JBNizet : 감사합니다! 동기화함으로써 정적 코드 부분을 스레드 세이프 (threadafe safe)하게 만들겠습니까? 내가 본 것은 콘솔에서 라인이 인쇄되면서이 정적 블록이 실행되는 첫 번째 GET 요청을 실행 한 후에 만 ​​첫 번째 요청을 시작하거나 서버를 시작할 때만 내 연결 풀이 생성된다는 의미입니까? – Santanu

+0

정적 블록을 포함하는 클래스가 초기화 될 때 정적 블록이 실행됩니다. 클래스가 첫 번째 요청 전에 사용되지 않으면 첫 번째 요청에서이 코드가 실행되는 것을 보는 것이 정상입니다. 나는 결코 동기화에 대해 아무 말도하지 않았다. 나는'con' 변수가 getNewConnection() 메소드의 지역 변수가 아니라 인스턴스 변수이기 때문에 코드가 스레드로부터 안전하지 않다고 말했다. –

답변

1

컨테이너에서 실행중인 경우 이미 연결 풀을 사용하고있을 가능성이 있습니다. 합리적인 최대 연결 수를 사용하여 올바르게 설정되었는지 확인하고 DB가 해당 번호를 지원할 수 있는지 확인하십시오.

컨테이너 외부에서도 자체 풀링 메커니즘을 작성하면 안됩니다.