본문 바로가기

Database/이론

[DB] DBCP (DataBase Connection Pool)

어느 수영장에서

A는 튜브줘 라고 요청을 하면 바람을 넣고 튜브를 빌려주고

B는 튜브줘 라고 요청을 하면 미리 바람을 넣은

튜브를 빌려준다고 가정합시다.

B방식처럼 데이터베이스 연결 객체를 만들어 놓고

필요할 때마다 연결 객체를 건네주는 것을

Connection Pool이라고 합니다.

 

이를 사용하기 위해서는 세팅이 필요합니다.

 

Meta Inf 폴더에 xml파일을 만들어줘야합니다.

이름은 context.xml로 지정하겠습니다.

context의 Resource태그를 써서 세팅을 해야합니다.

 

<?xml version = "1.0" encoding = "UTF-8"?>

<Context>

<Resource

name = "PuftPool"

type = "javax.sql.DataSource"

driverClassName = "oracle.jdbc.driver.OracleDriver"

factory = "org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"

username = "아이디"

password = "비번"

url = "jdbc:oracle:thin:@192.168.0.12:1521:xe"

maxTotal = "500"

maxIdle = "100"

/>

</Context>

 

 

name : 이름은 임의로 지정할 수 있음

이 이름을 통해서 DBCP에 접근, 커넥션풀을 이용할 수 있음

 

type : "javax.sql.DataSource" 이걸로 고정

 

driverClassName : DB Driver (우리는 Oracle 사용중)

 

factory : dbcp를 관리하는 JNDI 팩토리

(Java Naming and Directory Interface)

서비스에서 제공하는 데이터 및 객체를 발견(discover)하고

참고(lookup)하기 위한 자바 API입니다.

 

username : DB 접속 아이디

 

password : DB 접속 비밀번호

 

url : DB URL

 

maxTotal : 동시에 접속할 수 있는 커넥션 객체의 최대 수 (기본값 8)

 

maxIdle : 커넥션 풀에 반납할 때 최대로 유지될 수 있는 커넥션 수 (기본값 8)

 

기존 JDBC 프로그램을 구현할 때 DBMS와 연동을 작업을 하는데

클라이언트로부터 요청이 있을 때마다 DB서버와 연결하기 위해서

CONNECTION 객체를 얻어내야 했습니다.

 

이때 단점으로는

 

1. Connection 과정은 일정 시간이 필요한 작업

2. 불필요한 연결에 의한 서버 자원을 낭비

 

단점을 보완할 수 있는 것이 DBCP (DataBase Connection Pool)입니다.

여러개의 DB Connection을 하나의 Pool에 모아놓고 관리하는데

필요할 때마다 Pool에서 불러다가 사용하면 됩니다.

만약, 빌려올 수 있는 Connection이 없다면,

Connection 객체가 반환할 때까지 클라이언트는 대기 상태로 전환하고

사용이 끝난 Connection 객체는 다시 Pool로 반환합니다.

 

그러면 한 번 DB와 연결해보겠습니다.

 연결을 위한 DBManager 클래스를 하나 구현해서

다음과 같이 코드를 짭니다.

 

public class PuftDBManager {

public static Connection connect(String poolName) throws Exception {

Context ctx = new InitialContext();

DataSource ds = (DataSource)ctx.lookup("java:comp/env/" + poolName);

// java:comp/env/는 context.xml파일이 있는 경로

return ds.getConnection();

}

public static void close(Connection con, PreparedStatement pstmt, ResultSet rs) {

try {

rs.close();

}catch (Exception e) {}

try {

pstmt.close();

} catch (Exception e) {}

try {

con.close();

} catch (Exception e) {}}}

 

 

위 코드에서 사용된 기능이 JNDI(Java Naming and Directory Interface) 인데

Java 기술로 지정된 API로 어떤 파일/프로그램에 이름 지정 및 디렉토리 지정이 가능하다는 특징이 있습니다.

 InitialContext() : 이름이 있는 객체를 찾을때 사용하는 객체입니다.

DataSource : 커넥션풀의 Connection을 관리하기 위한 객체입니다.

 lookup메소드를 통해서 관리, Connection 객체를 가져올 수 있습니다.

 

String result = "실패";

Connection con = null;

 

try {

 

con = PuftDBManager.connect("PuftPool");

result = "성공";

} catch (Exception e) {

e.printStackTrace();

result = "실패: ";

}

 

jsp파일에서 해당 매니저의 Connect메소드를 불러와

연결해보도록 하겠습니다.

 

 

연결이 잘 되네요.

'Database > 이론' 카테고리의 다른 글

[DB] Delete  (0) 2025.01.03
[DB] Update  (0) 2025.01.03
[DB] 계층형 쿼리  (0) 2025.01.03
[DB] JOIN 연산의 종류  (0) 2025.01.03
[DB] View  (0) 2025.01.02