一、问题描述
2024年春节销售系统出现了如下错误,一天就能让服务死好几次,给运维人员和开发人员带来了无尽的烦恼。错误如下:
👋
java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
二、问题查找
log日志如下:
java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:118)
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:77)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:690)
at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:140)
at com.lg.database.DbManager.getConnection(DbManager.java:92)
at com.lg.utils.InterfaceLogUtils.writelog(InterfaceLogUtils.java:64)
at com.lg.dwlservice.DWLServiceImpl.getBillMessage(DWLServiceImpl.java:1414)
at sun.reflect.GeneratedMethodAccessor29.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.axis.providers.java.RPCProvider.invokeMethod(RPCProvider.java:397)
at org.apache.axis.providers.java.RPCProvider.processMessage(RPCProvider.java:186)
at org.apache.axis.providers.java.JavaProvider.invoke(JavaProvider.java:323)
at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
at org.apache.axis.handlers.soap.SOAPService.invoke(SOAPService.java:454)
at org.apache.axis.server.AxisServer.invoke(AxisServer.java:281)
at org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:699)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:643)
at org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:327)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.lg.filter.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:62)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:620)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:745)网上查找说是C3P0出的问题,C3P0 是一个开源的 JDBC 数据库连接池库,它提供了高度灵活和高性能的连接池实现。C3P0 可以与各种关系型数据库一起使用,包括 MySQL、Oracle、SQL Server 等。它的名称 “C3P0” 实际上代表 “Connect3 Pool”,意味着它可以管理多个数据库连接。
C3P0 的主要特点包括:
- 支持连接池的连接重用和管理。
- 可以配置连接池的各项参数,以满足不同性能需求。
- 具备连接超时、闲置连接的回收、异常处理等功能。
- 提供了 JMX 支持,可以通过 JMX 监控和管理连接池。
- 支持 JDBC3 和 JDBC4。
以上就是C3P0的好处现在我们来看生产环境配置的C3P0的参数
<c3p0-config>
<default-config>
<!-- 初始化连接池中的连接数,取值应在minPoolSize与maxPoolSize之间 -->
<property name="initialPoolSize">20</property>
<!-- 连接池中保留的最大连接数 -->
<property name="maxPoolSize">20</property>
<!-- 连接池中保留的最小连接数 -->
<property name="minPoolSize">1</property>
<!-- 当连接池连接耗尽时,客户端调用getConnection()后等待获取新连接的时间,
超时后将抛出SQLException,如设为0则无限期等待。单位毫秒。默认: 0 -->
<property name="checkoutTimeout">10000</property>
<property name="acquireIncrement">5</property>
<!-- 最大空闲时间,120秒内未使用则连接被丢弃。若为0则永不丢弃。 -->
<property name="maxIdleTime">120</property>
<property name="idleConnectionTestPeriod">60</property>
<property name="maxStatements">0</property>
<!-- 获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效
保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试
获取连接失败后该数据源将申明已断开并永久关闭。Default: false -->
<property name="breakAfterAcquireFailure">false</property>
</default-config>
<named-config name="ccc">
<property name="driverClass">oracle.jdbc.driver.OracleDriver</property>
<property name="jdbcUrl">jdbc:oracle:thin:@10.10.10.10:1521:xxxx</property>
<property name="user">sss</property>
<property name="password">sss</property>
</named-config>
</c3p0-config>认为是配置参数不合理导致的。
三、修改
经过代码是实际情况的多重因素我给出来了修改意见如下:
👉
<!-- 初始化连接池中的连接数,取值应在minPoolSize与maxPoolSize之间 -->
<property name="initialPoolSize">150</property>
<!-- 连接池中保留的最大连接数 -->
<property name="maxPoolSize">150</property>
<!-- 当连接池连接耗尽时,客户端调用getConnection()后等待获取新连接的时间,
超时后将抛出SQLException,如设为0则无限期等待。单位毫秒。默认: 0 -->
<property name="checkoutTimeout">60000</property>
把以上三个修改完成后,已经过去两天还没出现问题
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




