본문 바로가기
Java

DBCP (Database Connection Pool) 연습

by WaterPunch 2021. 4. 25.

DBCP란?

컨넥션을 미리 생성한 다음, 빌려주고 반납하는 방식

데이터베이스 연동시 컨넥션을 생성하고 소멸하는 것이 아니라 미리 Pool에 컨넥션들을 생성해놓고

빌려주고 반납받는 형식으로 시스템 성능을 향상시키기 위해 사용

>> 컨넥션을 생성시에 많은 자원을 소모하는데 이것은 성능 저하를 초래하고 이것을 효율적을 사용하기 위함

 

기존 JDBC 사용시

1. DB 접속을 위한 JDBC 드라이버 로드

2. getConnection Method로 부터 DB 컨넥션 객체를 얻음

3. 쿼리 수행을 위한 PreparedStatement 객체 생성

4. executeQuery를 실행해서 결과를 받아옴

  >> 이 과정에서 DB 연결할 때마다 Driver를 로드하고 컨넥션 객체를 얻어오는 작업을 반복하게 된다 >> 성능저하

 

DBCP 사용시

1. WAS 실행 시 미리 일정량의 DB Connection 객체를 생성하고 Pool 에 객체를 저장해둔다

2. DB 연결 요청이 있으면 Pool에서 Connection 객체를 가져다 쓴다

3. 다 쓰고나면 Pool에 Connection 객체를 반환

package org.waterpunch.dbcp.model;

import javax.sql.DataSource;
import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;

/*
 	Singleton Design Pattern : 시스템 상에서 단한번 객체 생성해 공유하여 사용하기 위해 적용하는 패턴
 */
public class DataSourceManager {
	//tomcat DBCP 구현체를 상위 DataSource 인터페이스 타입으로 관리
	//인터페이스 타입으로 관리하는 이유는 캡슐화, 다형성을 위해.
	//WAS 또는 DBCP 구현체가 변경되어도 이를 사용하는 클라이언트 코드(DAO)들은 수정할 필요가 없다
	//결합도를 낮추는 효과 -> 유지보수성 향상에 기여
    
    private static DataSourceManager instance = new DataSourceManager();
	private DataSource dataSource;
	private DataSourceManager() {
		BasicDataSource dbcp= new BasicDataSource();  //tomcat dbcp  //import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;
		dbcp.setDriverClassName("oracle.jdbc.OracleDriver"); //드라이버 로딩하는 정보를 넣어줌
		dbcp.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:xe"); // url 정보를 넣어줌
		dbcp.setUsername("scott"); // user name 정보 넣어줌
		dbcp.setPassword("tiger"); // password 정보 넣어줌
		dbcp.setMaxTotal(15); //  최대토탈을 만들수 있는 갯수
		this.dataSource=dbcp;
	}
	public static DataSourceManager getInstance() {
		return instance;
	}
	public DataSource getDataSource() {
		return dataSource;
	}
}
package org.waterpunch.dbcp.model;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;

public class PersonDAO {
	// 1. singleton design pattern 적용
	// 2. 생성자에서 datasource를 DataSourceManager로부터 얻어와 인스턴스 변수 datasource에 할당
	private DataSource dataSource;
	private static PersonDAO instance = new PersonDAO();
	private PersonDAO() {
		dataSource = DataSourceManager.getInstance().getDataSource();
	}
	public static PersonDAO getInstance() {
		return instance;
	}
    
	public int getPersonTotalCount() throws SQLException {
		int count=0;
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			con = dataSource.getConnection(); // 컨넥션을 빌려온다
			String sql = "select count(*) from person";
			pstmt = con.prepareStatement(sql);
			rs = pstmt.executeQuery();
			if(rs.next()) {
				count = rs.getInt(1);
			}
		} finally {
			closeAll(rs, pstmt, con);
		}
		return count;
	}
	
	public void closeAll(PreparedStatement pstmt,Connection con) throws SQLException {
		if(pstmt!=null)
			pstmt.close();
		if(con!=null)
			con.close(); // 컨넥션을 컨넥션풀(dpcp or DataSource)에 반납한다
	}
	public void closeAll(ResultSet rs,PreparedStatement pstmt,Connection con) throws SQLException {
		if(rs!=null)
			rs.close();
		closeAll(pstmt, con);  // 컨넥션을 컨넥션풀(dpcp or DataSource)에 반납한다
	}
}
반응형

'Java' 카테고리의 다른 글

[Spring] Spring MVC?  (0) 2021.06.02
MVC Architecture Model 2 연습예제  (0) 2021.04.25
MVC Architecture Model 1 연습예제  (0) 2021.04.23
Singleton Design Pattern(싱글톤 디자인 패턴)  (0) 2021.04.23
MVC Architecture ( Model 1 / Model 2 )  (0) 2021.04.22

댓글