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&characterEncoding=utf-8&autoReconnect=true&interactiveClient=true&autoReconnectForPools=true&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 을 사용하지 않는다.
댓글 없음:
댓글 쓰기