웹 응용 프로그램이 있습니다. 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;
}
}
그러나 모든 사용자 요청에 대해 글로벌 풀을 만들고 거기에서 연결을 공유 할 수 있는지 여부는 확실하지 않습니다. 의도적으로 정적 블록을 만들고 그 안에 모든 것을 넣으면 초기화가 한 번만 수행됩니다. 정말 내가 원하는 것을 이루는데 도움이 될까요? 그리고 내가 할 수있는 다른 튜닝이 있다면. 미리 감사드립니다 !!
예, 도움이됩니다. 하지만 코드는 스레드로부터 안전하지 않습니다. Connection은 getNewConnection()의 ** local ** 변수 여야합니다. 그리고 왜'getNewConnection()'이 정적이지 않은지 나는 정말로 알지 못합니다. 그리고 예외를 포착하고 무시해서는 안됩니다. –
@JBNizet : 감사합니다! 동기화함으로써 정적 코드 부분을 스레드 세이프 (threadafe safe)하게 만들겠습니까? 내가 본 것은 콘솔에서 라인이 인쇄되면서이 정적 블록이 실행되는 첫 번째 GET 요청을 실행 한 후에 만 첫 번째 요청을 시작하거나 서버를 시작할 때만 내 연결 풀이 생성된다는 의미입니까? – Santanu
정적 블록을 포함하는 클래스가 초기화 될 때 정적 블록이 실행됩니다. 클래스가 첫 번째 요청 전에 사용되지 않으면 첫 번째 요청에서이 코드가 실행되는 것을 보는 것이 정상입니다. 나는 결코 동기화에 대해 아무 말도하지 않았다. 나는'con' 변수가 getNewConnection() 메소드의 지역 변수가 아니라 인스턴스 변수이기 때문에 코드가 스레드로부터 안전하지 않다고 말했다. –