2016년 12월 18일 일요일

[java]데이터베이스 커넥션 싱글톤 구현

자바 기반 웹 어플리케이션의 경우 보통은 spring datasource + jndi 를 설정 하여 사용하는 경우가 대부분이다.

datasource 는 풀링 기법(connection 자원을 동적으로 재사용.) 및 분산처리  등 의 중요한 기능을 제공 하고 jndi 에서 각각의 데이터 베이스 별로 논리적 이름을 사용하여 설정 접근DBMS를 제어한다.

결국 datasource 는 서버에서 설정관리 되는 부분이고 개발자는 필요한 데이터 베이스 연결정보를 논리적 이름을 갖는 jndi 서비스 등록만 하게되면 사용 가능 하기때문에. 굳이..
싱글톤 패턴 (미리 정의된 객체를 매번 생성하지 않고 쓰고 반납하는 구조.)을 구현할 필요가 없다.

하지만. 소규모의 어플리케이션 에서는 직접 구현해야 할필요가 있을수도 있기때문에
알고는 있어야함.


//소스

import java.sql.Connection;
import java.sql.DriverManager;
import java.util.ArrayList;
import java.util.Hashtable;


public class DBConnectionPool {
String dburl;
String id;
String pwd;
String driverClass;

ArrayList<Connection> list = new ArrayList<Connection>();
Hashtable<Thread,Connection> rentTable = new Hashtable<Thread,Connection>();

public DBConnectionPool() {}

        //생정자로 데이터 베이스 연결정보를 셋팅한다.
public DBConnectionPool(
String dburl, String id, String pwd, String driverClass) {
this.dburl = dburl;
this.id = id;
this.pwd = pwd;
this.driverClass = driverClass;
}

        //부분 설정도 가능하게 setter method 생성
public DBConnectionPool setUrl(String url) {
this.dburl = url;
return this;
}

public DBConnectionPool setDriver(String driver) {
this.driverClass = driver;
return this;
}

public DBConnectionPool setUsername(String username) {
this.id = username;
return this;
}

public DBConnectionPool setPassword(String password) {
this.pwd = password;
return this;
}

         //--부분 설정도 가능하게 setter method 생성
     

        //현재의 프로세스에서 커넥션이 없을경우 생성후 보관 있을경우 재사용
public Connection getConnection() throws Exception {
Thread currThread = Thread.currentThread();

                //현제의 프로세스 에서 사용중인 connection 을 구한다.
Connection con = rentTable.get(currThread);

                //사용중인 connection 이 있을경우 재사용
if (con != null) {
return con;

        //없을경우
} else {
                        //커넥션 리스트에 사용가능한 커넥션이 있을 경우
                        if (list.size() > 0) {
con = list.remove(0);
//모든 커넥션이 사용중인 경우 커넥션을 생성한다.
} else {
Class.forName(driverClass);
con = DriverManager.getConnection(dburl, id, pwd);
}

                        //사용중으로 등록
rentTable.put(currThread, con);
return con;
}
}

        //커넥션 반환시 사용중 내역 삭제 및 다쓴 커넥션을 커넥션 리스트에 반환.
public void returnConnection(Connection con) {
Thread currThread = Thread.currentThread();
rentTable.remove(currThread);
list.add(con);
}
}


어플리케이션 시작시 생성자를 통해 셋팅하고 어플리케이션 컨텍스트에 저장해놓고 쓰기로 하자.

댓글 없음:

댓글 쓰기

[lunux]리눅스 폴더별 용량 확인

리눅스 폴더별 용량 확인 조회 하고자 하는 디렉토리 리스트가있는 경로로 이동후 du -h --max-depth=1