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)

你可能感兴趣的:(C3P0 连接池相关概念)