JNDIDBCP/DataSource의 사용법

JNDI등록을 통한 DBCP(Database Connection Pool)의 사용법을 간단히 알아보자

 

응용프로그램에서 데이터 베이스와 연결하는 커넥션을 생성하고 제거하는 작업은 많은자원을 소모한다. 만약 웹프로그램에서 다수의 사용자들이 접속할때마다 이커넥션을 생성하고 제거한다면 당신의 서버는 그부하를 견더낼수있을까? 이러한 문제를 해결해보고자 나온게 바로 DBCP이다.

 

먼저 이 DBCP사용을 위한 전체적인 구성을 한번 살펴보자  

사용자는 다음과 같은 요청을 통해 커넥션을 획득하고 데이터베이스에 접근하게 된다.

     사용자가 요청을 보낸다.

     사용자요청은 컨트롤영역을 거쳐 모델영역을 호출하게된다.

     모델영역으로 넘어간 요청은 JNDI에 등록된 데이터베이스정보(DBCP정보)객체

(Type:DataSource)를 검색한다.

     JNDI를 통해 찾은 정보객체(Type:DataSource)로부터 커넥션을 획득한다.

     데이터베이스 조작 작업이 끝난 후 획득한 커넥션을 다시 반환시킨다.

 

이제 JNDI등록을 통한 DBCP사용방법에 대해 자세히 알아보자 그전에 DBCP사용을 위한 환경설정이 되어있는지 살펴봐야 한다. 가장 중요한 것은 웹 컨테이너의 설치여부이다.

참고로 이글은 톰캣5.5x를 기준으로 설명한다. 또한 여기서 사용되는 DBCP는 자카르타DBCP API  사용하여 설명한다. 먼저 자카르타 DBCP를 사용하기 위해서는 별도의 jar파일이 필요하다.

다음의 jar파일을 다운받아서 webapps/WEB-INF/lib에 붙여 넣자 

 Commons-dbcp-1.2.1.jar

Commons-collections-3.1.jar

Commons-pool-1.2.jar

 자 이것으로 DBCP사용을 위한 API설치는 끝이다 이제 사용에 관한 정보설정에 들어가보자

(사실 위의 파일을 설치하지 않아도 톰캣5.X버전 이후부터는common/libnaming-factory-dbcp.jar이라는 하나의 라이브러리로 제공하고 있다고 한다. 한번 사용해보는 것도 권장한다.)

 

DBCP 사용에 관한 정보설정

가장먼저 JNDI서비스를 이용하기 위해 네임등록을 해야한다. Tomcat/conf/server.xml파일을 에디터로 열어보자

<!-- Global JNDI resources -->

  <GlobalNamingResources>

           …. 

</GlobalNamingResources>

태그가 보일것이다. 이태그의 사이에 우리가 사용할 DBCP에 대한 정보와 네임을 등록시킨다.

<Resource name="jdbc/OracleCp" //네임스페이스에 등록될 객체의 이름

                        auth="Container" //자원관리자

                        type="javax.sql.DataSource" //(반환 객체타입)

                        driverClassName="oracle.jdbc.driver.OracleDriver"//DB드라이버 클래스

                        loginTimeout="10"

                        maxWait="10"

                        username="scott"

                        password="tiger"

                        testOnBorrow="true"

                        url="jdbc:oracle:thin:@localhost:1521:ora9i" //데이터베이스의 위치정보

     />

여기서 중요한 것은 nametype 그리고 driverClassNameurl이라고 할수있다. Name은 실제로 JNDI서비스를 이용해 객체를 찾을 때 사용하는 이름이며 Type은 객체를 찾아 반환받는 타입이다.

driverClassNameurlDBMS와 그위치에 따라 바뀌는 것이므로 알아두자

이제는 DBCP를 웹애플리케이션에서 사용하기위해 배포서술자(web.xml)에 위와 똑같이 DBCP에대한 정보를 저장해야한다. 또한 톰캣5.X이상에서는 자원의 사용을 위해 별도의 Context.xml파일을 생성해 자원정보를 기술해야한다.(여기서 Context란 웹애플리케이션의 최상위 디렉토리명을 뜻한다. ) 만약 톰캣4.x를 사용한다면 별도의 Context.xml파일은 필요치않지만 대신 Tomcat/conf/

server.xml 파일에 컨텍스트정보와 함께 자원정보를 등록해야한다. 자원정보의 등록은 <context></context>태그를 통해 가능하며 <host></host>태그사이에 등록하도록한다.

Web.xml

<resource-ref>

  <description>Oracle Datasource</description>

  <res-ref-name>jdbc/OracleCP</res-ref-name>

  <res-type>javax.sql.DataSource</res-type>

  <res-auth>Container</res-auth>

  </resource-ref>

Tomcat5.x  위치:Tomcat/conf/Catalina/localhost/context.xml

<Context docBase="${catalina.home}/webapps/contextRootDirectory"

         privileged="true" antiResourceLocking="false" antiJARLocking="false">

      <Resource name="jdbc/OracleCP"

                        auth="Container"

                        type="javax.sql.DataSource"

                        driverClassName="oracle.jdbc.driver.OracleDriver"

                        loginTimeout="10"

                        maxWait="10"

                        username="scott"

                        password="tiger"

                        testOnBorrow="true"

                        url="jdbc:oracle:thin:@localhost:1521:ora9i"

     />

 

</Context>

Tomcat4.x  위치:Tomcat/conf/server.xml

<HOST>

<Context docBase="${catalina.home}/webapps/contextRootDirectory"

         privileged="true" antiResourceLocking="false" antiJARLocking="false">

      <Resource name="jdbc/OracleCP"

                        auth="Container"

                        type="javax.sql.DataSource"

                        driverClassName="oracle.jdbc.driver.OracleDriver"

                        loginTimeout="10"

                        maxWait="10"

                        username="scott"

                        password="tiger"

                        testOnBorrow="true"

                        url="jdbc:oracle:thin:@localhost:1521:ora9i"

     />

 

</Context>

</HOST>

이제 DBCP사용을 위한 설치 및 모든 설정이 끝이 났다.

그럼 이것을 어떻게 사용하느냐? 쉽다. 그냥 아래의 코드를 외우자

private javax.sql.DataSource cp;

 

try{

javax.naming.Context ctx = new InitialContext();//네이밍조작을 위한 초기 컨텍스트 반환

cp = (DataSource) ctx.lookup("java:/comp/env/jdbc/OracleCP");//등록된 이름의 자원 반환

}catch(Exception e){

  e.printStackTrace();

                     }

Connection con=cp.getConnection();//커넥션 얻어옴

 위의 컨텍스트는 네이밍 서비스를 이용하기 위해 바인딩 정보를 가지고 있는 컨텍스트 객체이다.

이 컨텍스트 객체를 통해 이름으로 등록된 DBCP객체를 가져올수있다. 그러면 위의 설정에서 명시한대로 DataSource타입으로 객체가 반환된다.

여기서 주의해서 볼 것은 커넥션풀을 이용해 커넥션을 가져오는데 DriverManager클래스를 이용한게 아니라 DataSource클래스를 통해 가져왔다는것이다. DataSource를 이용하는 이유는? API를 보자 잘나와있다.(API는 이럴 때 사용하라고 있는거다.)

마지막으로"java:/comp/env/jdbc/OracleCP"의 부분이다. 여기서 우리가 설정시 지정해준 이름은

jdbc/OracleCP이다 그럼 java:/comp/env/? 요건 JNDI사용시 등록되는 자원들이 놓이게되는 가상공간(Name Space)이라고 하더라 그냥 접두어같이 외워서 쓰자 


출처 -  http://blog.naver.com/ceresrits?Redirect=Log&logNo=40062891265 


==================================================================================

제가 아는 한도 내에서 설명을 드리겠습니다. 틀릴 수 있으니 참조 정도로만 하시고 여러 책과 인터넷 상의 데이터를 모아 공부하시면 좋을 듯 합니다.

우선 DataSource는 데이터베이스에 접근하기 위한 하나의 표준 인터페이스로 등장했고 특히 DBCP(Database Connection Pooling)를 이용하기 위한 표준 방식이라 보시면 될 듯 합니다.

그래서 JNDI(Java Naming and Directory Interface)를 통해 해당 객체에 접근할 수 있어 DataSource 객체를 가져옵니다.

그런 다음 java.sql.Connection 객체를 얻어와서 일반적으로 JDBC 코딩 하듯이 사용하면 됩니다.

DataSource가 나오기 전에는 수많은 DBCP 구현체가 나와서 소스 간 가독성 등등이 부족했었는데 이 표준 방식을 사용하면 매우 편하게 이해할 수 있었겠죠.

보통 WAS는 자체 구현한 DataSource 구현체가 있으므로 해당 JDBC 드라이버만 적절하게 등록해주면 사용할 수 있습니다.

Tomcat과 같은 JSP/Servlet Container는 같은 자카르타 프로젝트 중 하나인 Commons 중 DBCP 패키지가 있으니 이를 이용하면 됩니다.

설정 방법은 지식인에서 뒤져보시면 많이 나오니까 그걸 참조하면 될 겁니다.

그럼 해당 소스 부분만 설명해 드리죠.


import javax.naming.*;
import javax.sql.*;
Import java.sql.*;

... 중략

Context ctx = new InitialContext(); // (1)
DataSource ds =
(DataSource) ctx.lookup("java:/comp/env/jdbc/mydbtest"); // (2)
Connection conn = ds.getConnection();

... 중략 

conn.close();


위는 자바 소스 상에서의 사용법입니다.

(1)과 (2)는 JNDI에서 등록된 객체나 서비스를 이름으로 가져오는 부분의 코드입니다.

이쪽은 따로 공부해주시면 좋은데 잘 모르겠거든, 그냥 설정에서 DataSource 설정에 부여한 이름을 사용한다 정도로만 생각해 주시면 되겠군요.

그 뒤는 동일합니다. 그리 복잡할 내용이 아니니 생략합니다.

핵심은 DataSource 설정과 JNDI를 통한 객체의 획득입니다.

그러니 기본적으로 DBCP 기능이 있다고 봐도 되지만, 구현에 따라 무늬만 DBCP인 듯 보이는 경우도 있으니 관련 패키지의 문서를 주의 깊게 읽어보시고 사용 결정을 하시면 될 듯 싶네요.

그럼 조금이라도 도움이 되셨길... 


출처 - 네이버 지식인
Posted by linuxism
,