본문 바로가기
카테고리 없음

DBCP(DataBase Connection Pooling Service) _ context.xml 과 web.xml 수정해 사용하는 방법

by hotdogya 2012. 12. 20.

출처 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에 의해서 관리된다.