본문 바로가기
개발 공부/JAVA

[JAVA] DBCP (DataBase Connection Pool)

by sngynhy 2021. 9. 8.

DB 관련 이슈

1. 커넥션 : 앱(프로그램)과 DB의 연결 -> DB에 접속하고 종료하는 일련의 동작 과정

다수의 연결이나 정확하지 않은 연결, 해제가 없는 연결 => 시스템 부하 => 비용 손실

최대 연결 커넥션 초과로 DB 접속이 불가능해짐 (셧다운)

해결방안) 클라이언트 <-> DB데이터 <-- 서버 DB

데이터 일치를 위한 알고리즘, 보안, .. (동기화 작업 필요)

 

2. 트랜잭션 : 여러 작업을 하나의 작업처럼 단위화 (작업 단위)

 

DBCP

일정한 개수의 커넥션을 미리 확보하여 클라이언트 요청 시 확보한 커넥션을 앱에 제공하는 서비스

=> 시스템 부하 해결 -> DB 연결 성능 향상

클라이언트 -> 웹 -> JNDI -> 커넥션 풀(CP) -> DB

(지금까지는 클라이언트 -> 웹 -> JDBC -> DB 방식이었지만 이제는 위의 방식으로 접근)

 

이용 순서

1) 웹 어플리케이션 서버(톰캣)가 시작되면 커넥션을 미리 생성 == DBCP

2) 요청이 들어오면 JNDI를 이용하여 커넥션 객체를 전달

*JNDI(Java Naming and Directory Interface) : 어떤 과정이나 절차, 알고리즘 등을 캡슐화하여 처리

*네이밍 서비스(Naming Service) : 자바 객체(*), 서비스 파일, 서버 등을 가상의 이름과 연결해줌

3) 사용하지 않는 커넥션은 종료되고, 최소한의 커넥션을 유지 (모두 종료 X)

=> 클라이언트가 요청하면 바로 연결 가능 -> 성능 향상

 

 

커넥션 풀 이용 시

톰캣에 DBCP 내장되어 있기 때문에 별도의 설치가 필요하지 않음

DBCP : JDBC에서 제공하는 DataSource 인터페이스를 활용

 -> JNDI를 통해 DataSource 인터페이스를 제공받을 수 있음

 

★설정 과정

1. 톰캣 서버에 DataSource 등록

2. server.xml OR context.xml : xml 파일에 DBCP 자원 등록 설정

(*.xml -> "설정"파일) - server.xml은 (웬만하면) 건들지 말 것!

 

<Resource maxIdle="5" maxActive="10" username="kim" password="1234" url="jdbc:oracle:thin:@localhost:1521:xe" auth="Container" driverClassName="oracle.jdbc.driver.OracleDriver" name="jdbc/orcl" type="javax.sql.DaraSource" />

 

3. JNDI 연결 시 필요한 각종 설정 추가

web.xml 파일에 웹 어플리케이션에서 참조하는 각종 서버 리소스에 대한 설정 변경 필요!

 

DBCP 연결 확인 예제)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>DBCP 확인</title>
</head>
<body>

<!-- dataSource값은 web.xml에 작성된 <res-ref-name>jdbc/orcl</res-ref-name> -->
<sql:query var="rs" dataSource="jdbc/orcl">
	select * from member
	<!-- sql구문에 ;은 붙이지 않을 것! -->
</sql:query>

<h2>DBCP 연결 테스트</h2>
<c:forEach var="v" items="${rs.rows}">
	${v.id} / ${v.name} <br>
</c:forEach>

</body>
</html>

 

[결과]

member 테이블 데이터 불러오기 성공!