[컴][웹] tomcat 에서 context.xml 에 JNDI 를 이용해 DataSource 설정하기




JNDI 사용해서 DataSource 설정

아래처럼 DataSource 를 설정하는 경우에
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:/comp/env/jdbc/namh"/>
    <property name="resourceRef" value="true" />
</bean>

jdbc/namh 을 어디엔가 정의해 주게 되는데, 그곳이 context.xml 이다.

java:/comp/env


에서 보면, java:/comp/env 는 tomcat 에서 Context 를 구성하게 되면 Context 안의 resource 들을 사용할 때 사용한다.



context.xml


위의 글에서 보듯이 tomcat 의 application directory 안에 /META-INF/context.xml 이 기본적으로 context.xml 로 지정되어 있다.

http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html



<Context path="" docBase="ROOT" distributable="true">
    <Resource name="jdbc/namh"
                auth="Container"
                type="javax.sql.DataSource"
                factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
                initialSize="3"
                maxTotal="30"
                maxIdle="10"
                minIdle="2"
                maxWaitMillis="60000"
                validationQuery="SELECT 1"
                testWhileIdle ="true"
                timeBetweenEvictionRunsMillis = "1800000"
                logAbandoned="true"
                jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
                username="xxxxxx"
                password="pspspsp"


                loginTimeout="10"
                driverClassName="com.mysql.jdbc.Driver"
                url="jdbc:mysql://127.0.0.1:65001/db_name?useUnicode=true&amp;characterEncoding=utf-8&amp;autoReconnect=true&amp;interactiveClient=true&amp;autoReconnectForPools=true&amp;characterSetResults=UTF-8"/>
</Context>


이 때 $CATALINA_HOME/lib 에 jdbc driver 의 jar libaray 가 들어 있어야 한다.




Database connection pool leaks

Database connection pool(DBCP) 은 connection 에 대한 pool 을 만들어 놓고 그녀석들을 재사용하는 것이다. 그런데 이 녀석에게 한가지 문제가 있다고 한다.
web application 이 ReulstSet, Statement, Connection 에서 사용한 connection 들을 명시적으로 close 해야 한다는 것이다. web application 에서 이녀석들을 close 하지 못하면 close 되지 못한 녀석들은 다시 사용할 수 없게 된다. 이런 녀석들이 database connection pool leak 이다.

Apache Commons DBCP 를 설정해서 이런 버려진 connection 들(abandoned connections) 을 알아서 찾아가지고 다시 사용할 수 있도록 할 수 있다.

이 설정은 <Resource> 설정에 다음 속성을 추가하면 된다. default 값은 false 이다.
removeAbandoned="true"
f
아래의 설정을 통해서 DBCP 가 log 에 database connection resource 들을 abandon 시키는 code 의 stack trace 를 찍게 할 수도 있다.
logAbandoned = "true"




context.xml 설정이 적용되지 않는 경우


server.xml 에 설정이 되어 있으면 META-INF/context.xml 이 먹히지 않는다.
java - javax.naming.NameNotFoundException: Name is not bound in this Context. Unable to find - Stack Overflow


It is NOT recommended to place <Context> elements directly in the server.xml file. This is because it makes modifying the Context configuration more invasive since the main conf/server.xml file cannot be reloaded without restarting Tomcat.(출처 : Apache Tomcat 7 Configuration Reference (7.0.56) - The Context Container)

<apach-tomcat-path>\conf\Catalina\localhost 폴더안에 ROOT.xml 이 있고, 그 안에 Resource 가 있는 경우에도 context.xml 을 사용하지 않는다.

댓글 없음:

댓글 쓰기