暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

C3P0惹的祸

原创 bjgzxx 2024-02-17
59

一、问题描述

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论