Tomcat连接池耗尽
问题描述:
我在我的项目中使用Apache Tomcat JDBC连接池。我很困惑,因为在重负荷下我不断看到以下错误:Tomcat连接池耗尽
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
我的期望是与统筹,新的连接请求会被保留在队列中,直到连接变得可用。相反,似乎请求在池达到容量时被拒绝。这种行为可以改变吗?
感谢,
达尔
这是我的池配置:
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");
答
该工作按设计/实施,如果你看到的日志Timeout: Pool empty. Unable to fetch a connection in 10 seconds
和你的配置是p.setMaxWait(10000);
。请求线程在放弃等待连接之前等待10秒(10000毫秒,maxwait)。
现在你有两个解决方案,增加maxActive连接的数量或检查是否有任何连接泄漏/长时间运行的查询(你不期望)。
通常人们忘了(因此使用号码)设置以下属性: 最大空闲:8 最大活性:100 分钟空闲:8个 – user817795 2017-09-09 07:48:46
谢谢! @ user817795用于指出此最大空闲,最小空闲参数设置!更具体地说,它是spring.datasource.tomcat.max-active,max-idle,min-idle。否则,最大空闲=最大活动。请参阅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获取详细的解释。 – 2018-02-20 01:56:56