출처 http://blog.naver.com/perfectlampe/80165644103
- 연결 개수를 적절히 설정해서 현재 연결된 사용자가 더 이상 Connection 객체를 사용하지 않을 때 해당 Connection 객체를 반환받아 다른 사용자에게 할당해야 한다. 이것을 Connection Pooling이라 하고 DBCP라고 한다.
- DBCP도 개발된 API가 있다. 우리가 사용하는 웹 서버인 톰캣에 포함되어 있기 때문에 내려 받을 필요가 없다.
- 설정된 정보를 이름으로 획득하려면 자바의 네이밍 API를 사용해야 한다. 네이밍 패키지의 클래스를 가지고 이름으로 객체를 획득하는 것을 JND(Java Naming and Directory Interface)라고 한다.
JND는 tomcat.apache.org 사이트에 접속하면 예시문을 확인하고 사요할 수 있다.
1. 해당하는 tomcat 버젼에 맞는 Document에 접속한다.
2. User Guide에서 JDBC DataSources 에 들어가면 예시문을 볼 수 있다.
3. 영어로 되어 있지만
MySQL, Oracle, PostgreSQL 등 예시문을 보고 사용할 수 있다.
<소스 예제>
1. 먼저 Context.xml 파일을 만들어서 다음과 같은 리소스(Resource)를 등록한다. 리소스는 위에 설명한 Tomcat 사이트에 JND에 대한 예시문에서 DB에 맞는 예시문을 확인 할 수 있다.
<그림설명>
>> WebContent 폴더의 META-INF 폴더에 Context.xml 파일을 만든다.
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<!-- Resource를 등록하여 웹에서 JNDI로 호출할 이름과 정보를 설정한다. -->
<Resource
name="jdbc/myoracle" auth="Container" type="javax.sql.DataSource"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:xe"
username="oraclejava"
password="oraclejava"
maxActive="20"
maxIdle="10"
maxWait="-1" />
</Context>
<!--
1. name : JNDI로 호출될 이름을 설정한다.
(접근 -> java:comp/env/jdbc/myoracle)
2. auth : DBCP를 관리할 관리자 (Container or Application)
3. type : 해당 resource의 return type
(DataSource는 Connection 객체를 반환할 수 있다.)
4. factory : dbcp를 유용하는 관리 클래스
(Tomcat 5.x에 기본으로 존재하는 클래스)
(직접 DBCP 클래스를 지정해도 동작하는데 문제가 없다.)
(그러나, Factory 클래스를 이용하면 좀더 안정적으로 관리할 수 있다.)
5. dirverClassName : JDBC를 이용하기 위한 드라이버 클래스
6. url : DB의 접속 URL (속성으로 자동 재 접속을 선택했다.)
7. username : DB의 계정 명
8. password : 계정에 대한 비밀번호
9. maxActive : 최대 접속 허용 개수
10. maxIdle : DB Pool에 여분으로 남겨질 최대 Connection 개수
11. maxWait : DB 연결이 반환되는 Timeout의 최대 시간 (-1은 무한 대기)
12. removeAbandoned : Connection이 잘못 관리되어 버려진 연결을 찾아 재활용할 것인지의 여부 설정
(true 설정일 때 현재 DB 연결이 적으면 버려진 연결을 찾아 재활용)
13. removeAbandonedTimeout : 버려진 연결로 인식할 기본 시간 설정
(초 단위로 해당 시간이 지나면 버려진 연결로 인식한다.)
-->
< -- 서블릿에서의 파일 소스 예제-- >
2. web.xml 파일에 다음과 같이 JDNI로 정의할 이름을 등록한다.
등록 위치는 <webcome-file-list> 태그 바로 윗부분.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>Round16</display-name>
<resource-ref>
<description>My SQL Resource</description> <!-- 리소스 설명 -->
<res-ref-name>jdbc/myoracle</res-ref-name>
<!-- 리소스 이름(JNDI명) -->
<res-type>javax.sql.DataSource</res-type> <!-- 리턴 Type -->
<res-auth>Container</res-auth> <!-- 관리 계층 -->
</resource-ref>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
3. Class 파일에서 DBCP로 연결하기
<<원래 JDBC로 연결하는 부분>>
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String id = "oraclejava";
String pass = "oraclejava";
try{
class.forName("oracle.jdbc.OracleDriver");
con = DriverManager.getConnection(url, id, pw);
}catch(Exception e){
}
연결하는 부분이 다음과 같이 변한다.
try{
Context context = new InitialContext();
DataSource source = (DataSource)context.lookup("java:comp/env/jdbc/myoracle");
con = source.getConnection();
}catch(Exception e){
}
<<코드설명>>
Context context = new InitialContext();
--> JNDI를 사용하기 위해 객체를 생성한다.
DataSource source = (DataSource)context.lookup("java:comp/env/jdbc/myoracle");
--> context 객체를 가지고 이름으로 리소를 획득한다. JNDI의 이름은 기본적으로
java:comp/env에 등록되어 있다. 해당 영역에서 jdbc/myoracle으로 설정된 이름을 획득한다.
con = source.getConnection();
--> source 객체로부터 Connection 객체를 획득한다. 이 객체는 이제 웹 컨테이너의 DBCP에 의해서 관리된다.