📌 1. DBCP
- DBCP : DataBase Connection Pool
- 데이터베이스와 연결된 커넥션을 미리 만들어서 저장해 두고 있다가 필요할 때 저장된 공간(
pool
)에서 가져다 쓰고 반환하는 기법을 말한다.
- 커넥션 풀은 이용하면 커넥션을 미리 만들어 두고 사용하기 때문에 매번 사용자가 요청할 경우 드라이버를 로드하고, 커넥션 객체를 생성해 연결하고 종료하는 비효율적인 작업을 하지 않아도 된다.
- 즉 데이터베이스의 부하를 줄일 수 있고 자원을 효율적으로 관리할 수 있다.
📍 1-1. DBCP 기본 설정 정보
- driverClassName : DB작업을 위해 로딩할 JDBC 드라이버 파일에 드라이버 인터페이스를 상속하는 파일명 지정. Class.forName() 메소드의 인자값이다.
- url : 접속할 DB 서버의 URL 지정
- username : DB 서버에 로그인할 계정 지정
- password : DB 서버에 로그인할 계정 비밀번호 지정
- name : 현재 리소스를 등록할 이름 지정
- type : 리소스의 타입 지정(
javax.sql.DataSource
)
📍 1-2. DBCP 사이즈 설정 옵션
- maxActive : 생성할 Conneciton 수 지정
- maxIdle : 일반적으로 활용할 Connection 수 지정
- maxWait : Connection의 사용 요청이 있을 때의 대기 시간
(밀리세컨드 단위, 대기시간이 지난 후에도 Connection을 얻지 못하면 Exception 발생)
➕ 반납되지 않은 커넥션 회수 옵션
ResultSet.close()
를 통해 직접 닫아 주지 않은 코드를 추적해 복구하거나 재생할 때 사용하는 옵션
- removeAbandoned : 사용할 수 있는 커넥션이 부족할 때 버려진 커넥션을 찾아 복구하고 재생한다. (기본값 :
false
)
removeAbandoned = "true"
- removeAbandonedTimeout : 커넥션이 버려졌다고 간주되기 전에 사용되지 않은 시간(
초
)를 설정한다.
removeAbandonedTimeout = "5"
- logAbandoned : 커넥션 자원을 낭비한 코드 위치의 로그를 남긴다.
logAbandoned = "true"
📍 1-3. DBCP 설정, 사용 예시
- Servers config 폴더 내의
context.xml
에 추가
<Resource
name = "jdbc/oracle"
auth = "Container"
type = "javax.sql.DataSource"
driverClassName = "oracle.jdbc.driver.OracleDriver"
url = "jdbc:oracle:thin:@localhost:1521:xe"
username = "jsp"
password = "jsp"
maxActive = "20"
maxIdle = "20"
maxWait = "-1"
/>
webapp - WEB-INF > web.xml
에 추가
<resource-ref>
<description>Connection</description> // 리소스에 대한 설명
<res-ref-name>jdbc/oracle</res-ref-name> // 리소스 이름 등록
<res-type>javax.sql.DataSource</res-type> // 리소스 타입 지정
<res-auth>Container</res-auth> // 리소스 권한 지정
</resource-ref>
Context context = new InitialContext(null);
DataSource dataSource = (DataSource)context.lookup
("java:comp/env/jdbc/oracle");
// 톰캣에서 리소스를 관리하는 가상의 디렉터리 `java:comp/env`에서
//`jdbc/myoracle`이라는 이름의 리소스를 찾는다.
Connection conn = dataSource.getConnection();
📌 2. JNDI
- JNDI : Java Naming and Directory Interface
- 디렉토리 서비스에서 제공하는 데이터 및 객체를 발견하고 참고하기 위한 자바 API.
- 외부(WAS)에 있는 객체를 가져오기 위한 기술 방법
- DB Pool을 미리 Naming시켜 두는 방법 (DB 연결 방법 중 하나)
- 우리가 저장해 놓은 WAS의 데이터베이스 정보에 JNDI를 설정해 놓으면, 웹 어플리케이션은 JNDI만 호출하면 간단하다.
➕ Naming & Directory 서비스
- Naming & Directory 서비스는 이름값만을 가지고 자원을 연결하여 이용할 수 있게 하는 개념이다.
- 실제 어떤 자원을 가지고 서비스하는 것이 아니라, 어떤 서버나 애플리케이션에서 분산환경에 서비스하고자 하는 자원을 이
Naming & Directory
서버에 이름값과 실제 자원을 연결하여 등록하면, 해당 자원을 이용하고자 하는 다른 애플리케이션에서 서버에 접근하여 이름값을 가지고 연결해서 이용할 수 있다.
- 예시 : DNS 서버
- 브라우저창에 URL을 입력하면 브라우저는 DNS서버를 통해 도메인에 해당하는 IP주소를 얻는다. 그리고 IP 주소를 통해 실제 인터넷 서버에 접속한다.
- 결국 DNS 서버는 실제 인터넷 서비스를 수행해주는 곳이 아니며, 도메인과 IP 주소만을 연결해주는 기능을 한다.
📍 2-1. 사용 이유
- 운영, 관리, 최적화 문제 대처에 다양한 이점이 있다.
- 개발을 한 사람과 실제 서비스를 운영하는 담당자는 다른 경우가 많으므로 소스 레벨에서 설정되어 있는 것보다 WAS에서 설정되어 있는 것을 선호한다.
- WAS에 여러 개의 웹 어플리케이션을 올려서 사용하기 때문에 WAS에서 한 번에 설정해 주는 것이 자원낭비를 줄일 수 있다.
- 또한 장애가 나거나 성능이 정상적이지 못하면 다른 한 서버가 대신 일을 해줄 수 있다.
📍 2-2. DataSource
- 커넥션 풀에서 생성된
Connection
객체들을 관리하기 위한 객체
- JNDI Server를 통해 이용된다. 이 객체를 통해 필요한
Connection
을 획득하거나 반납한다.
- DataSource 이용 절차
- 1) JNDI Server에서
lookup( )
메소드를 통해 DataSource
객체를 획득한다.
- 2)
DataSource
객체의 getConnection( )
메소드를 통해서 Connection Pool에서 Free 상태의 Connection 객체를 획득한다.
- 3)
Connection
객체를 통한 DBMS 작업을 수행한다.
- 4) 모든 작업이 끝나면
DataSource
객체를 통해서 Connection Pool에 Connection
을 반납한다.