DB Connection 유지를 위한 방안

Java에서 DB에 대한 연결을 미리 맺어두고 사용하는 Connection Pool을 활용하고 있습니다. 그런데 문제는 Connection이 일정 시간 아무런 사용이 없을 경우 서버 단에서 해당 Connection의 연결을 끊는 경우인데요. 이는 서버 단의 DB 설정값을 변경해서 해결할 수 있지만, 여러가지 정책 상 DB 설정값을 변경할 수 없을 때가 있습니다. 예를 들어, DB 관리자가 전에 사귀다가 이별한 여자친구라던지……..

이러한 경우!! 에 Connection Pool을 운영하는 어플리케이션 단에서 해당 Connection에 대해 일정 시간 간격으로 어떤 연산을 주기적으로 호출함으로써 연결을 계속 유지하도록 할 수 있습니다. 이러한 연결 유지는 스레드를 통해 구동되는 것이 적당한데요. 아래의 코드는 이러한 목적으로 이번에 도입한 스레드 코드입니다.

코드는 매우 단순하지만 향후 급할때 기억을 쉽게 더듬을 수 있도록 저장해 둡니다.

package control;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import model.DBConnection;

public class DBConnectionMaintainerThread extends Thread {
    private volatile boolean bGoOn = true;
	
    public void run() {
        DBConnection conn = null;
        Connection rConn = null;
        ResultSet RS = null;
        Statement readStmt = null;
		
        while(bGoOn) {
            try {
                Thread.sleep(10000);
	        	          
                conn = MainEntry.dbMan.getResource("cim");           
                rConn = conn.getRawConnection();
                readStmt =  rConn.createStatement();
    	        RS = readStmt.executeQuery("select 1");   
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if(RS != null) {
                    try {
                        RS.close();
                        if(readStmt != null) readStmt.close();
                        if(conn != null) MainEntry.dbMan.putResource("cim", conn);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

위의 코드는 10초 간격으로 Connection Pool에서 Connection을 꺼내와 가장 간단한 쿼리인 SELECT 1;을 주기적으로 호출해 주고 있습니다. 참고로 Connection Pool의 코드와 섞여 있으니 필요한 코드만 쏙쏙 골라 보시기 바랍니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다