자세한 내용은
를 참고하세요.
<Resource name="jdbc/testDs"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.QueryTimeoutInterceptor"
auth="Container"
type="javax.sql.DataSource"
username="root"
password="root"
driverClassName="org.mariadb.jdbc.Driver"
validationQuery="SELECT 1"
validationInterval="15000"
testOnBorrow="true"
testWhileIdle="true"
timeBetweenEvictionRunsMillis="5000"
minEvictableIdleTimeMillis="10000"
removeAbandoned="true"
removeAbandonedTimeout="10"
url="jdbc:mysql://localhost:3306/test"
logAbandoned="true"
initialSize="5"
maxIdle="5"
minIdle="5"
maxActive="10"/>
그런데 이렇게만 설정하면 오류가 발생합니다. 정확히는 NullPointerException 이 발생하는 것이죠.
6월 15, 2015 3:54:27 오후 org.apache.tomcat.jdbc.pool.ConnectionPool init
심각: Unable to inform interceptor of pool start.
java.lang.NullPointerException
at org.apache.tomcat.jdbc.pool.interceptor.QueryTimeoutInterceptor.setProperties(QueryTimeoutInterceptor.java:36)
at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:470)
at org.apache.tomcat.jdbc.pool.ConnectionPool.(ConnectionPool.java:144)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:116)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:103)
at org.apache.tomcat.jdbc.pool.DataSourceFactory.createDataSource(DataSourceFactory.java:554)
at org.apache.tomcat.jdbc.pool.DataSourceFactory.getObjectInstance(DataSourceFactory.java:242)
at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:141)
at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321)
at org.apache.naming.NamingContext.lookup(NamingContext.java:842)
at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
at org.apache.naming.NamingContext.lookup(NamingContext.java:830)
at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
at org.apache.naming.NamingContext.lookup(NamingContext.java:830)
at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
at org.apache.naming.NamingContext.lookup(NamingContext.java:830)
at org.apache.naming.NamingContext.lookup(NamingContext.java:167)
at org.apache.naming.SelectorContext.lookup(SelectorContext.java:156)
at javax.naming.InitialContext.lookup(InitialContext.java:411)
......
6월 15, 2015 3:54:27 오후 org.apache.naming.NamingContext lookup
경고: Unexpected exception resolving reference
java.sql.SQLException
at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:476)
at org.apache.tomcat.jdbc.pool.ConnectionPool.(ConnectionPool.java:144)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:116)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:103)
at org.apache.tomcat.jdbc.pool.DataSourceFactory.createDataSource(DataSourceFactory.java:554)
at org.apache.tomcat.jdbc.pool.DataSourceFactory.getObjectInstance(DataSourceFactory.java:242)
at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:141)
at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321)
at org.apache.naming.NamingContext.lookup(NamingContext.java:842)
at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
at org.apache.naming.NamingContext.lookup(NamingContext.java:830)
at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
at org.apache.naming.NamingContext.lookup(NamingContext.java:830)
at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
at org.apache.naming.NamingContext.lookup(NamingContext.java:830)
at org.apache.naming.NamingContext.lookup(NamingContext.java:167)
at org.apache.naming.SelectorContext.lookup(SelectorContext.java:156)
at javax.naming.InitialContext.lookup(InitialContext.java:411)
그래서 이렇게 합니다. queryTimeout 을 2초로 설정하는 경우로 말입니다.
jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.QueryTimeoutInterceptor(queryTimeout=2000)"
그리고 위에서 설정한 값(queryTimeout)은 getQueryTimeout() 으로 얻을 수 있습니다.
하지만 아무데서나 getQueryTimeout() 을 하면 안됩니다.
Statement stmt = null;
null 값인 stmt 에서 stmt.getQueryTimeout() 은... 안됩니다.
stmt = conn.createStatement();
하지만 이제, 됩니다.
마지막으로 QueryTimeoutInterceptor 클래스 소스입니다.
package org.apache.tomcat.jdbc.pool.interceptor;
import java.lang.reflect.Method;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Map;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
import org.apache.tomcat.jdbc.pool.PoolProperties.InterceptorProperty;
public class QueryTimeoutInterceptor
extends AbstractCreateStatementInterceptor
{
private static Log log = LogFactory.getLog(QueryTimeoutInterceptor.class);
int timeout;
public void setProperties(Map<String, PoolProperties.InterceptorProperty> properties)
{
super.setProperties(properties);
this.timeout = ((PoolProperties.InterceptorProperty)properties.get("queryTimeout")).getValueAsInt(-1);
}
public Object createStatement(Object proxy, Method method, Object[] args, Object statement, long time)
{
if (((statement instanceof Statement)) && (this.timeout > 0))
{
Statement s = (Statement)statement;
try
{
s.setQueryTimeout(this.timeout);
}
catch (SQLException x)
{
log.warn("[QueryTimeoutInterceptor] Unable to set query timeout:" + x.getMessage(), x);
}
}
return statement;
}
public void closeInvoked() {}
}