Tomcat连接池耗尽

11

我在项目中使用Apache Tomcat JDBC连接池。在重载期间,我看到了以下错误:

12:26:36,410 ERROR [] (http-/XX.XXX.XXX.X:XXXXX-X) org.apache.tomcat.jdbc.pool.PoolExhaustedException: [http-/XX.XXX.XXX.X:XXXXX-X] Timeout: Pool empty. Unable to fetch a connection in 10 seconds, none available[size:4; busy:4; idle:0; lastwait:10000].
12:26:36,411 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/APP].[AppConf]] (http-/XX.XXX.XXX.X:XXXXX-X) JBWEB000236: Servlet.service() for servlet AppConf threw exception: org.jboss.resteasy.spi.UnhandledException: java.lang.NullPointerException

我的期望是使用连接池时,请求新连接将在队列中等待,直到有可用连接。但实际上,当连接池已满时,请求会被拒绝。这种行为可以更改吗?

谢谢,

Dal

这是我的连接池配置:

PoolProperties p = new PoolProperties();
p.setUrl("jdbc:oracle:thin:@" + server + ":" + port + ":" + SID_SVC);
p.setDriverClassName("oracle.jdbc.driver.OracleDriver");
p.setUsername(username);
p.setPassword(password);
p.setMaxActive(4);
p.setInitialSize(1);
p.setMaxWait(10000);
p.setRemoveAbandonedTimeout(300);
p.setMinEvictableIdleTimeMillis(150000);
p.setTestOnBorrow(true);
p.setValidationQuery("SELECT 1 from dual");
p.setMinIdle(1);
p.setMaxIdle(2);
p.setRemoveAbandoned(true);
p.setJdbcInterceptors(
    "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"
    + "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;" 
    + "org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer");
1个回答

13

如果你看到日志显示Timeout: Pool empty. Unable to fetch a connection in 10 seconds,而且你的配置是p.setMaxWait(10000);,那么这是按照设计/实现工作的。请求线程在等待连接之前会等待10秒钟(即最大等待时间为10000毫秒)。

现在你有两个解决方案:增加最大活动连接数或检查是否存在连接泄漏/长时间运行的查询(这是不可预期的)。


3
通常人们会忘记设置以下属性(请相应地使用数字): 最大空闲时间:8 最大活跃连接数:100 最小空闲连接数:8 - user817795
1
感谢@user817795指出了这些max-idle,min-idle参数设置!更具体地说,它是spring.datasource.tomcat.max-active、max-idle、min-idle。否则,max-idle = max-active。请参见https://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html#Common_Attributes和https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html以获取详细说明。 - Ryan X

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接