美文网首页
C3P0常见生产问题深入剖析

C3P0常见生产问题深入剖析

作者: 猩球驿站 | 来源:发表于2020-10-01 01:21 被阅读0次

    1、背景

    开发一些DB应用是(如web应用)经常会用到C3P0,然而在某些场景下C3P0会报各种问题,比如APPARENT DEADLOCK、服务饿死或无响应,遇到这些问题,不知道从何下手,只有通过"重启大法"来解决,但生产环境往往会要求保证服务器的服务可用性,尽可能减少不能宕机,在未深入理解这些底层的东西,总会很“虚”担心线上哪天会炸掉。为此,笔者分析了下源码,深入分析了下,希望该文章可以答疑解惑,读完此文希望你可以解决如下问题:

    • APPARENT DEADLOCK
    • Could not retrieve transaction read-only status from server
    • can not read response from server

    2、连接池

    在深入分析之前,我们先简单回顾下,DB连接的生命过程。

    • 通过Driver来打开连接
    • 创建一个读写数据的TCP socket
    • 读写数据
    • 关闭连接
    • 关闭socket

    不难看出,创建连接的过程是很费时间的,如何尽可能避免该过程可以显著提高程序的性能,为此通过创建连接池复用连接的设计思路应运而生,当然目前市面上有多中实现:比如Apache Commons DBCP、HikariCP、C3PO等,本文主要剖析的是C3P0。

    3、C3P0术语约定

    在C3P0中有几个关键术语,对于理解源码至关重要,在此列出:

    • DataSource
      数据源,绑定JNDI,屏蔽不同数据库厂商对读取数据的影响。
    • managed
      HashMap数据结构存储,在用连接(managed connection),在连接池配置的最大值和最小值之间。
      连接池中现有的连接数
    • 空闲连接(unused connection)
      LinkedList数据结构存储,方便连接的增删操作,表示可被checkout的连接。
    • 应排除连接 (excluded connection)
      无效但仍在用的连接
    • 连接等待者集(acquireWaiters)
      Hashset,等待checkout连接的用户数
    • 其它等待者集 otherWaiters
      Checkout的连接被其它异步任务占用,此时会加入该集合中。
      c3p0后台运行很多定时任务(实现了TimerTask),如AsyncTestIdleResourceTask、CullTask、AcquireTask等。这些任务在检测资源会加锁占用资源,导致checkout的用户等待,进入该集合。
    • 定时任务(TimerTask)
      同步或异步完成各类任务,如死锁检测、空闲连接检测等等。

    4、 获取连接

    简单而言,获取连接过程如下图所示:

    相关文章

      网友评论

          本文标题:C3P0常见生产问题深入剖析

          本文链接:https://www.haomeiwen.com/subject/ydqmuktx.html