반응형

Tomcat 5.0 JNDI Datasoruce 설정


JNDI Datasoruce 설정 개요

  • Tomcat 5 JNDI DataSource를 통한 DB 커넥션 풀 사용
  • JNDI를 통한 커넥션 풀 사용은 J2EE 표준이고, 현존하는 거의 모든 웹 컨테이너가 지원
  • Jakarta의 DBCP 커넥션 풀과 Tomcat JNDI 설정을 통해 데이터베이스 커넥션 풀을 사용하는 방법 제시
  • 기본적으로 필요한 라이브러리
    • commons-dbcp.jar
    • commons-collections.jar
    • commons-pool.jar
    • DB에 대한 JDBC 라이브러리 (JAR)

JNDI Naming Resource 설정

  1. 위 라이브러리들을 $CATALINA_HOME/common/lib 에 복사한다. 그 이외 디렉토리에 두면 안된다.
  2. Connection 풀을 이용할 경우에는 ResultSet과 Connection 객체를 필히 직접 닫아 줘야만 한다.
  3. $CATALINA_HOME/conf/server.xml 혹은 각 웹 컨텍스트별 XML 파일의 <Context>의 자식 요소로 <Resource>를 추가한다.
  4. 웹 어플리케이션의 web.xml파일에 <resource-ref>를 추가하여 JNDI 리소스를 사용할 수 있도록 한다.
  5. 전역적인 JNDI 리소스를 이용하고자 하는 경우는 <GlobalNamingResources>

Server.xml

server.xml
<Resource name="jdbc/forumDb" auth="Container" type="javax.sql.DataSource"/>
<!-- Resource의 name 속성을 이용해서 각 어플리케이션에서 javax.sql.DataSource 객체를 얻어가게 된다. -->

<!-- 자세한 파라미터 설정은 위의 참조사이트에서 확인 -->
<ResourceParams name="jdbc/forumDb">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>

<parameter>
<name>maxActive</name>
<value>100</value>
</parameter>

<parameter>
<name>maxIdle</name>
<value>30</value>
</parameter>

<parameter>
<name>maxWait</name>
<value>10000</value>
</parameter>

<!-- DB 사용자명과 비밀번호 설정 -->
<parameter>
<name>username</name>
<value>dbuser</value>
</parameter>
<parameter>
<name>password</name>
<value>dbpasswd</value>
</parameter>

<!-- JDBC 드라이버 클래스 -->
<parameter>
<name>driverClassName</name>
<value>oracle.jdbc.driver.OracleDriver</value>
</parameter>

<!-- JDBC 접속 URL -->
<parameter>
<name>url</name>
<value>jdbc:oracle:thin:@dbhost:1521:ORA</value>
</parameter>
</ResourceParams>
전역 JNDI 리소스 이용
  • <Resource>와 <ResourceParams> 요소를 server.xml의 <GlobalNamingResources> 의 자식노드로 옮기면 특정 웹 어플리케이션이 아니라, 이 톰캣에 설치된 전체 웹 어플리케이션에서 사용 할 수 있게 된다. 하지만 각 웹 어플리케이션 "<Context>"에 다음과 같은 설정을 해야 한다.
server.xml의 <Context> 부분에 추가
<ResourceLink
name="jdbc/forumDb"
global="jdbc/forumDb"
type="javax.sql.DataSource"
/>
  • 아니면 server.xml에서 <Host> 요소의 자식으로 다음을 추가하면 각 컨텍스트별 설정 필요없이 전체 웹 어플리케이션 컨텍스트에서 GlobalNamingResources로 지정된 JNDI 리소스를 사용할 수 있다.
server.xml의 <Context> 부분에 추가
<DefaultContext>
<ResourceLink
name="jdbc/forumDb"
global="jdbc/forumDb"
type="javax.sql.DataSource"
/>
</DefaultContext>

web.xml

web.xml에 리소스에 대한 reference를 설정
<resource-ref>
<description>Forum DB Connection</description>
<!-- 다음이 바로 리소스의 이름 -->
<res-ref-name>jdbc/forumDb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

Tomcat 5.5 JNDI Datasoruce 설정


DBCP(Database Connection Pool) 설정

  • 라이브러리 설치
    • Jakarta-Commons DBCP
    • Jakarta-Commons Collections
    • Jakarta-Commons Pool
  • DBCP 는 Jakarta-Commons Database Connection Pool을 사용하는데, 위에 있는 세개의 라이브러리는 $CATALINA_HOME/common/lib/naming-factory-dbcp.jar의 한개의 JAR에 포함되어 있다.
  • 이 하나의 라이브러리가 존재하는지 확인한다.

DB connection pool 누수 방지하기

  • DBCP Datasource 설정에 다음 Resource 속성을 설정한다.
  • 디폴트는 false이다.
removeAbandoned="true"
  • 취소된 Connection에 대한 timeout 시간을 설정한다.
  • 디폴트 timeout 시간읜 300초이다.
removeAbandonedTimeout="60"
  • Connection 리소스를 취소하는 코드의 Stack Trace를 로깅하도록 설정한다.
  • 디폴트는 false이다.
logAbandoned="true"

MySQL DBCP 예제

  • MySQL JDBC 드라이버 설치 
    • MySQL 3.23.47, MySQL 3.23.47 using InnoDB,, MySQL 3.23.58, MySQL 4.0.1alpha
    • Connector/J 3.0.11-stable (the official JDBC Driver)
    • mm.mysql 2.0.14 (an old 3rd party JDBC Driver)
    • 이 중에 하나의 드라이버를 결정하여 $CATALINA_HOME/common/lib에 복사한다.
  • Context 설정 (context.xml)
context.xml
<Context path="/DBTest" docBase="DBTest"
        debug="5" reloadable="true" crossContext="true">

    <!-- maxActive: Maximum number of dB connections in pool. Make sure you
         configure your mysqld max_connections large enough to handle
         all of your db connections. Set to -1 for no limit.
         -->

    <!-- maxIdle: Maximum number of idle dB connections to retain in pool.
         Set to -1 for no limit.  See also the DBCP documentation on this
         and the minEvictableIdleTimeMillis configuration parameter.
         -->

    <!-- maxWait: Maximum time to wait for a dB connection to become available
         in ms, in this example 10 seconds. An Exception is thrown if
         this timeout is exceeded.  Set to -1 to wait indefinitely.
         -->

    <!-- username and password: MySQL dB username and password for dB connections  -->

    <!-- driverClassName: Class name for the old mm.mysql JDBC driver is
         org.gjt.mm.mysql.Driver - we recommend using Connector/J though.
         Class name for the official MySQL Connector/J driver is com.mysql.jdbc.Driver.
         -->

    <!-- url: The JDBC connection url for connecting to your MySQL dB.
         The autoReconnect=true argument to the url makes sure that the
         mm.mysql JDBC Driver will automatically reconnect if mysqld closed the
         connection.  mysqld by default closes idle connections after 8 hours.
         -->

  <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
               maxActive="100" maxIdle="30" maxWait="10000"
               username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"
               url="jdbc:mysql://localhost:3306/javatest?autoReconnect=true"/>

</Context>
  • web.xml 설정
    • WebRoot의 WEB-INF/web.xml 파일에 다음 <resource-ref> 부분을 추가한다.
web.xml
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
  <description>MySQL Test App</description>
  <resource-ref>
      <description>DB Connection</description>
      <res-ref-name>jdbc/TestDB</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
  </resource-ref>
</web-app>

Oracle 8i, 9i & 10g 예제

  •  Oracle의 경우에는 MySQL 예제에서 최소한의 수정을 통해 설정할 수 있다.
  • 오라클9i까지는 oracle.jdbc.driver.OracleDriver 드라이버를 지원하지만 이후에는 oracle.jdbc.OracleDriver 드라이버를 활용해야 한다.
  • 오라클 드라이버를 포함하는 JAR 파일을 $CATALINA_HOME/common/lib에 설치한다.
  • context.xml 설정
<Resource name="jdbc/myoracle" auth="Container"
              type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
              url="jdbc:oracle:thin:@127.0.0.1:1521:mysid"
              username="scott" password="tiger" maxActive="20" maxIdle="10"
              maxWait="-1"/>
  • web.xml 설정
<resource-ref>
 <description>Oracle Datasource example</description>
 <res-ref-name>jdbc/myoracle</res-ref-name>
 <res-type>javax.sql.DataSource</res-type>
 <res-auth>Container</res-auth>
</resource-ref>
  • 자바 활용 코드 예제
Context initContext = new InitialContext();
Context envContext  = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
Connection conn = ds.getConnection();
//etc.

Tomcat 6.0 JNDI Datasoruce 설정


Tomcat 5.5와 동일한 설정

  • 톰캣 5.5의 설정방법과 동일하게 6.0에서도 설정한다.

참고자료


 

+ Recent posts