C3P0 连接池相关概念

C3P0 连接池相关概念

笔者为了解决服务问题查阅了相关 C3P0 的文档,然后为了增强记忆手打该文,并将其作为笔者自己其他文章的链接,故笔者仍将其作为原创文章。网上有更多更全面的关于 C3P0 连接池的文档,待包括笔者在内的众读者移步参考。

一、简要介绍

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新再建立一个;释放空间时间超过最大空闲时间的数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
C3P0 十一个开源的 JDBC 连接池,它实现了数据源和 JNDI 绑定,支持 JDBC3 规范和 JDBC2 的标准扩展。目前使用它的开源项目有 Hibernate, Spring 等。

二、参数配置

1. 最常用配置:

  • acquireIncrement: 连接池在无空闲连接可用时,一次性创建的新数据库连接数 (default: 3)
  • initialPoolSize: 连接池初始化时创建的连接数 (default: 3)
  • minPoolSize: 连接池保持的最小连接数 (default: 3)
  • maxPoolSize: 连接池中拥有的最大连接数;如果获得新连接时会使连接总数超过这个值,则不会再获取新连接,而是等待其他连接释放,所以这个值有可能会设计的很大 (default: 15)
  • maxIdleTime: 连接的最大空闲时间,如果超过这个时间,某个数据库连接还没有被使用,则会断开这个连接;如果为 0,则永远不会断开连接,即回收这个连接 (default: 0)

2. 管理连接池的大小和连接的生存时间:

  • maxConnectionAge: 配置连接的生存时间,超过这个时间的连接将由连接池自动断开丢弃掉。当然正在使用的连接不会马上断开。
  • maxIdelTimeExcessConnections: 这个配置主要是为了快速减轻连接池的负载,比如连接池中连接数因为某次数据访问高峰导致创建了很多数据连接,但是后面的时间段需要的数据库连接数很少,需要快速释放,必须小于 maxIdleTime。其实这个没必要配置,maxIdleTime 已经配置了。

3. 配置连接测试:

  • automaticTestTable: 配置一个表名,连接池根据这个表名用自己的测试 sql 语句在这个空表上测试数据库连接,这个表只能由 C3P0 来使用,用户不能操作(该参数不建议使用,default: null)
  • perferredTestQuery: 与上面的 automaticTestTable 二者只能选一。自己实现一条 SQL 检测语句。(default: null)
  • idleConnectionTestPeriod: 用来配置测试空闲连接的间隔时间。测试方式还是上面的两种之一,可以用来解决 MySQL 8 小时断开连接的问题。因为它保证连接池会每隔一定时间对空闲连接进行一次测试,从而保证有效的空闲连接能每隔一定时间访问一次数据库,将于 MySQL 8 小时无会话的状态打破。为 0 则不测试。(建议使用,default: 0)
  • testConnectionOnCheckin: 如果为 true,则在 close 的时候测试连接的有效性。(不建议使用,default: false)
  • testConnectionOnCheckout: 性能消耗大。如果为 true,在每次 getConnection 的时候都会测试,为了提高性能,尽量不要用(不建议使用,default: false)

4. 配置 PreparedStatement 缓存:

  • maxStatements: 连接池为数据源缓存的 PreparedStatement 的总数。由于 PreparedStatement 属于单个 Connection,所以这个数量应该根据应用中平均连接数乘以每个连接的平均 PreparedStatement 来计算。同时 maxStatementsPerConnection 的配置无效。(不建议使用,default: 0)
  • maxStatementsPerConnection: 连接池为数据源单个 Connection 缓存的 PreparedStatement 数,这个配置比 maxStatements 更有意义,因为它缓存的服务对象是单个数据连接,如果设置的好,肯定是可以设置性能的。为 0 时不缓存。(看情况而论,default: 0)

5. 重连相关配置:

  • acquireRetryAttempts: 连接池在获得新连接失败时重试的次数,如果小于等于 0 则无限重试直至连接获得成功。(建议使用,default: 30)
  • acquireRetryDelay: 连接池在获得新连接时的间隔时间。(建议使用,default: 1000)
  • checkoutTimeout: 配置当连接池所有连接用完时,应用程序 getConnection 的等待时间;为 0 则无限等待直至有其他连接释放或者创建新的连接,不为 0 则当时间到的时候如果仍没有获得连接,则会抛出 SQLException。其实就是 acquireRetryAttempts * acquireRetryDelay (与上面两个有重复,选择其中两个都行;default: 0)

6. 定制管理 Connection 的生命周期:

  • connectionZCustormizerClassName: 用来定制 Connection 的管理,比如在 Connection acquired 的时候设定 Connection 的隔离级别,或者在 Connection 丢弃的时候进行资源关闭,就可以通过继承一个 AbstractConnectionCustomizer 来实现相关方法,配置的时候使用全类名。有点类似监听器的作用。(不建议使用,default: null)

7. 配置未提交的事务处理:

  • autoCommitOnClose: 连接池在回收数据库连接时是否自动提交事务。如果为 false,则会回滚未提交的事务,如果为 true,则会自动提交事务。(不建议使用,default: false)
  • forceIgnoreUnresolvedTransactions: 这个配置强烈不建议为 true。(不建议使用,defualt: false)

8. 配置 debug 和回收 Connection:

  • unreturnedConnectionTimeout: 为 0 时要求所有的 Connection 在应用程序中必须关闭。如果不为 0,则强制在设定的时间到达后回收 Connection,所以必须小心设置,保证在回收之前所有数据库操作都能够完成。这种限制减少 Connection 未关闭情况的不是很实用。建议手动关闭。(不建议使用,default: 0,单位 s)
  • debugUnreturnedConnectionStackTraces: 如果为 true 并且 unreturnedConnectionTimeout 设为大于 0 的值,当所有被 getConnection 出去的连接 unreturnedConnectionTimeout 时间到的时候,就会打印出堆栈信息。只能在 debug 模式下适用,因为打印堆栈信息会减慢 getConnection 的速度(不建议使用,default: false)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容