tomcat jdbc池超时不起作用
Posted
技术标签:
【中文标题】tomcat jdbc池超时不起作用【英文标题】:tomcat jdbc pool timeout not working 【发布时间】:2014-07-21 14:55:54 【问题描述】:我正在使用 tomcat jdbc 连接池 和 Oracle 数据库开发高负载应用程序。确保我的应用程序具有非常小的数据库查询超时(不超过 3 秒)以防止长时间运行的查询或数据库缓慢阻塞我的所有应用程序,这一点非常重要。为了模拟长时间运行的查询,我使用 ALTER SYSTEM QUIESCE RESTRICTED 语句将数据库置于 QUIESCE 状态。
但看起来超时值没有影响 - 当我开始测试我的应用程序时,它挂起......
这是我的 jdbc 池配置:
String connprops = "oracle.net.CONNECT_TIMEOUT=3000;oracle.jdbc.ReadTimeout=3000;"
+ "oracle.net.READ_TIMEOUT=3000";
pp.setConnectionProperties(connprops);
pp.setDriverClassName("oracle.jdbc.OracleDriver");
pp.setTestOnBorrow(true);
pp.setTestOnConnect(true);
pp.setTestOnReturn(true);
pp.setTestWhileIdle(true);
pp.setMaxWait(2000);
pp.setMinEvictableIdleTimeMillis(20000);
pp.setTimeBetweenEvictionRunsMillis(20000);
pp.setValidationInterval(3000);
pp.setValidationQuery("SELECT 1 FROM DUAL");
pp.setMaxAge(3000);
pp.setRemoveAbandoned(true);
pp.setRemoveAbandonedTimeout(3);
pp.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.QueryTimeoutInterceptor(queryTimeout=3)");
dataSource = new DataSource();
dataSource.setPoolProperties(pp);
这就是我使用连接的方式(非常简单):
Connection conn = dataSource.getConnection();
Statement stmt = null;
ResultSet rs = null;
try
stmt = conn.createStatement();
rs = stmt.executeQuery(/*some select query*/);
if (rs.next())
result = rs.getInt(1);
/*process the result*/
rs.close();
stmt.close();
conn.close();
catch(Exception e)
logger.error("Exception: " + e.getMessage(), e);
finally
if (conn != null)
if(rs!=null)
rs.close();
if(stmt!=null)
stmt.close();
conn.close();
有什么想法吗?提前致谢!
【问题讨论】:
【参考方案1】:尝试使用此配置:
String connprops = "oracle.net.CONNECT_TIMEOUT=\"3000\";oracle.jdbc.ReadTimeout=\"3000\";"
+ "oracle.net.READ_TIMEOUT=\"3000\"";
java.util.Properties.java
忽略所有非字符串值:
public String getProperty(String key)
Object oval = super.get(key);
String sval = (oval instanceof String) ? (String)oval : null; // <- !!!!
return ((sval == null) && (defaults != null)) ? defaults.getProperty(key) : sval;
您可能还应该使用java.sql.Statement's query timeout:
stmt.setQueryTimeout(3); // int seconds
【讨论】:
以上是关于tomcat jdbc池超时不起作用的主要内容,如果未能解决你的问题,请参考以下文章