반응형
Tomcat 5.0 JNDI Datasoruce 설정
- 참고사이트
- Tomcat 5.0
- Tomcat Admin을 통한 JNDI Datasource 설정: http://www.okjsp.pe.kr/lecture/viewlet/okjsp2005/05_webdev_datasource.html
- 파일 수정을 통한 설정방법: http://okjsp.pe.kr/seq/54402
- Tomcat 5.0
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 설정
- 위 라이브러리들을 $CATALINA_HOME/common/lib 에 복사한다. 그 이외 디렉토리에 두면 안된다.
- Connection 풀을 이용할 경우에는 ResultSet과 Connection 객체를 필히 직접 닫아 줘야만 한다.
- $CATALINA_HOME/conf/server.xml 혹은 각 웹 컨텍스트별 XML 파일의 <Context>의 자식 요소로 <Resource>를 추가한다.
- 웹 어플리케이션의 web.xml파일에 <resource-ref>를 추가하여 JNDI 리소스를 사용할 수 있도록 한다.
- 전역적인 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 설정
- 참고사이트
- JNDI Datasource 설정은 5.0에서 5.5로 톰캣이 업그레이드되면서 다소 변경이 발생하였다.
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에서도 설정한다.