DBCP란?
Database Connection Pool 의 약어로 Java 언어로 개발된 어플리케이션에서 데이터베이스 연결 관리를 담당하는 라이브러리 또는 프레임 워크입니다.
Java DBPC는 데이터베이스 연결을 관리하는 데 사용되며, 일반적으로 다중 스레드 환경에서 사용되는 애플리케이션에서 데이터베이스 연결을 효율적으로 관리하기 위해 사용됩니다. 이를 통해 애플리케이션에서 데이터베이스와의 연결을 만들고 해제하는 데 드는 비용을 줄일 수 있습니다.
Java DBPC는 연결 풀을 사용하여 데이터베이스 연결을 관리합니다. 연결 풀은 미리 정의된 수의 데이터베이스 연결을 생성하고 풀에 저장한 다음, 애플리케이션이 연결이 필요할 때마다 해당 연결을 풀에서 가져와 사용합니다. 연결이 사용되고 난 후에는 다시 풀에 반환되어 재사용됩니다.
DBCP의 장점
- 자원 관리 및 성능 향상 (연결 생성, 해제 불필요)
- 동시성 처리 (여러 사용자 요청 처리)
- 연결 유효성 검사
- 설정 가능한 매개변수
- 다양한 데이터베이스 지원
- 널리 사용되는 라이브러리
DBCP 객체 사용 절차
1. 애플리케이션에서 DBPC를 사용하여 데이터베이스 연결을 가져옵니다. 이때 연결 풀은 사용 가능한 연결 객체를 제공합니다.
2. 애플리케이션은 데이터베이스 작업을 수행합니다. 이때 연결 객체를 사용하여 쿼리를 실행하거나 데이터를 읽거나 쓸 수 있습니다.
3. 데이터베이스 작업이 완료되면, 애플리케이션은 연결 객체를 다시 풀에 반환합니다. 이를 통해 해당 연결 객체는 다른 애플리케이션에서 재사용될 수 있습니다.
4. 연결 객체가 풀에 반환되면, 풀은 해당 연결 객체를 사용 가능한 상태로 표시합니다.
5. 이후 애플리케이션에서 또 다른 데이터베이스 연결이 필요한 경우, 연결 풀은 사용 가능한 연결 객체를 제공합니다. 이때 반환된 연결 객체 중 하나가 선택되어 애플리케이션에 제공됩니다.
6. 애플리케이션이 데이터베이스 작업을 모두 완료하고 더 이상 연결 객체가 필요하지 않은 경우, 애플리케이션은 해당 연결 객체를 다시 풀에 반환합니다.
7. 이러한 과정을 통해 연결 풀은 일정한 수의 연결 객체를 관리하고, 필요에 따라 생성하거나 반환하여 애플리케이션의 데이터베이스 연결을 효율적으로 관리합니다.
사용방법 및 예시
https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-juli/9.0.37
이 곳에 가셔서 다운 받으시고 저희 매번 저장하는 그곳 아시죠?
src/main/webapp/WEB-INF/lib/tomcat-juli-9.0.37.jar
이곳에 넣어주세요!
다음으로 이제 DataSourceManger Class를 만들어보겠습니다.
DataSourceManger Class 제작
public class DataSourceManager {
private static DataSourceManager instance=new DataSourceManager();
private DataSource dataSource;
private DataSourceManager() {
//apache tomcat에서 제공하는 dbcp를 사용
BasicDataSource dbcp=new BasicDataSource();
dbcp.setDriverClassName("oracle.jdbc.OracleDriver");
dbcp.setUrl("jdbc:oracle:thin:@dbIP:xe");
dbcp.setUsername("mango");
dbcp.setPassword("apple");
dbcp.setInitialSize(10);
dbcp.setMaxTotal(30);
this.dataSource=dbcp;
}
public static DataSourceManager getInstance() {
return instance;
}
public DataSource getDataSource() {
return dataSource;
}
}
1. 싱글톤 패턴으로 하나의 Pool을 만들어 줍니다.
2. javax.sql.DataSource 인터페이스도 선언해줍니다.
-> 다양한 DBCP 객체들을 하나의 방식으로 제어하기 위한 인터페이스입니다.
3. 생성자를 이용해서 BasicDataSource 객체 생성
-> apache tomcat 에서 제공하는 dbcp 구현체 , javax.sql.DataSource 인터페이스의 하위 구현체를 만듭니다.
4. 구현체에 driver, Url, username, password 를 등록합니다.
5. setInitialSize(10)은 연결 pool이 처음 생성될 때 초기 연결 개수를 설정하는 메서드입니다. 10개의 데이터베이스 연결이 생성됩니다.
6. setMaxTotal(30) 은 연결 풀이 관리하는 최대 연결 개수를 설정하는 데 사용됩니다. 최대 30개의 데이터베이스 연결을 동시에 사용가능합니다.
public class ItemDAO {
private static ItemDAO instance = new ItemDAO();
private DataSource dataSource;
private ItemDAO() {
// dbcp 를 반환받아 인스턴스 변수에 할당
this.dataSource = DataSourceManager.getInstance().getDataSource();
}
public static ItemDAO getInstance() {
return instance;
}
public void closeAll(PreparedStatement pstmt, Connection con) throws SQLException {
if (pstmt != null)
pstmt.close();
if (con != null)
con.close();// 컨넥션을 close 하여 소멸시키는 것이 아니라 pool 에 반납
}
public void closeAll(ResultSet rs, PreparedStatement pstmt, Connection con) throws SQLException {
if (rs != null)
rs.close();
closeAll(pstmt, con);
}
public int findItemCount() throws SQLException {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
int totalItemCount = 0;
try {
con = dataSource.getConnection();// 컨넥션을 생성하는 것이 아니라 pool 에서 빌려옴
String sql = "select count(*) from item";
pstmt = con.prepareStatement(sql);
rs = pstmt.executeQuery();
if (rs.next())
totalItemCount = rs.getInt(1);
} finally {
closeAll(rs, pstmt, con);// 컨넥션을 close 하여 소멸시키는 것이 아니라 pool 에 반납
}
return totalItemCount;
}
}
1. 이렇게 만들고 DB와 연결하는 Class에 가서 생성자에서 dataSource를 위에 작성한DataSourceManager.getInstance().getDataSource() 로 할당해줍니다.
2. sql문에 연결할 때 dataSource.getConnection을 통해서 DataSource에서 연결 객체를 빌려오면 됩니다.
3. 요청이 다 끝나면 close를 해주면서 다시 connection 객체를 반납해줍니다.
소감
오늘의 배움 역시 너무나도 추상적인 개념이라 머릿속에 그려지지 않았지만 계속 해서 그려보려고 노력하면서 조금은 보이기 시작했습니다. 솔직히 아직 엄청 큰 프로그램을 마주하지 못하여 얼마나 이런 것이 돈이 많이드는지는 모르지만 선조들의 배움을 의심하지 않기에 믿고 계속 공부해보려합니다.
'코딩 개발 > Java' 카테고리의 다른 글
게시판 만들기 (프로젝트 맛보기) (6) | 2023.06.17 |
---|---|
JSP EL - 디렉토리 변경 시 path 관리 (0) | 2023.06.13 |
AJAX - JSON 이용 (5) | 2023.06.09 |
Reflection API (feat. FrontController) (0) | 2023.06.04 |
MVC - FrontController Pattern (0) | 2023.05.31 |