`

[转]DBCP连接池:原理与基本配置

    博客分类:
  • java
阅读更多

转于

大约在半年前,曾经帮同事解决过一个Commons-dbcp连接池的问题。当时遇到的问题比较诡异,但是其实并不是什么特别复杂的问题,了解DBCP的原理,大部分问题就迎刃而解了。本文主要对连接池的基本原理以及dbcp的实现方式做一个分析,对dbcp的配置参数结合原理做一个简单解释。

连接池扼要

JDBC是一套通用的Java语言与多种数据库(文件)通讯的标准API。大部分针对数据库服务器(例如Oracle, MySQL等等)的JDBC实现都是基于TCP/IP连接的客户端-服务器端通讯方式。

当我们需要执行一个数据库操作时,有下面三步:

  1. 客户端与服务器之间建立一个数据库连接
  2. 执行某种数据库操作
  3. 断开连接

如果每次处理都要走上面的三步,则应用程序与数据库服务器都要将大量的时间和资源消耗在数据连接的断开与建立上。对于某些数据库系统,一个数据库连接就是一个进程,而且数据库连接通常要占用不少资源,如排序区/Join区等等。对于并发较大的系统,建立一次连接然后缓存起来连续使用,直到程序结束等情况下再释放连接,就能够将系统资源集中在对数据库操作的处理上,从而大大提高性能。通常情况下将数据连接的建立和断开委托给一种能够数据库连接池的组件或服务进行管理。而DBCP, C3p0, Proxool等都是常用的开源的连接池组件。

就好像A公司在郊外,他们公司附近没有出租车。如果A公司有人要出去办事,他必须打电话给出租公司订车,用完车后他还要付账报销。 这样每个人出去一趟都必须订车、退车和报销。员工的很多时间白白花费在这上面了。于是A公司跟出租车公司定了一个合同,出租车公司给了他们一个车队。要用车随时去楼下找车队就可以了,用完了也不必结帐,A公司统一跟出租车公司订车和结帐。这个车队就好比连接池,由公司(应用程序)来统一向出租车公司(数据库服务器)订车(建立连接)和退车(关闭连接)。

DBCP的配置参数以及背后的原理

Commons-dbcp连接池的配置参数比较多,也比较复杂,主要分为

  • Jdbc连接参数(username, password, url, driverClassName, connectionProperties )
  • 事务处理参数 (defaultAutoCommit, defaultReadOnly, defaultTransactionIsolation, defaultCatalog)
  • 连接池参数(详见下文)
  • 连接池中链接存活性测试参数(详见下文)
  • 预处理查询池化参数(poolPreparedStatements, maxOpenPreparedStatements)
  • 丢弃失效链接相关参数(详见下文)以及一个控制是否可以正常情况下处于访问连接池包装下的底层JDBC链接参数(accessToUnderlyingConnectionAllowed)

其中Jdbc链接参数、事务处理都跟连接池关系不大,另预处理查询池化参数本文不详细叙述。有关commons-dbcp的详细参数配置信息请参考官方文档

连接池的配置

再用车队来比喻,出租车公司每提供一辆车给A公司,A公司肯定要付出一定费用。这时候维持车队的大小就很重要了,在项目少用车少的时候,车队肯定要减少,不然很多空闲车辆也要付出成本;在项目多用车多的时候,肯定要扩大车队,不然车不够用,车队忙不过来。A公司可以简单地设地两个阀值来动态调节车队中空闲的车辆数目以满足动态需求,一个是最小空闲车辆数(最小空空闲连接数(minIdle),当剩余的空车数目小于该数目时,A公司就向出租车公司请求加入新车。 一个是最大空闲车辆数(maxIdle),当剩余的车大于该数目时,就将刚刚用用完的车还给出租车公司从而减少车队数量。

另外,这家出租车公司可能要为多个客户服务,要考虑能够提供给A公司的最大的车数量,不能超过某个数量(maxActive)。所以A公司想出租车申请新车时首先要看下当前正在用的车辆数目是否超过了这个最大数目,如果没有超过那就直接申请新车,否则可以让申请者(应用程序中执行请求的线程)等待 (maxWait<=0, 无限等待; maxWait>0 当等待时间超过 maxWait时,失败)。

在连接池中,这几个参数是十分重要的,官方的说明如下,是我们调节系统性能时需要认真考虑的值。


Parameter Default Description
initialSize 0 The initial number of connections that are created when the pool is started.

Since: 1.2
线程池启动时初始化的连接数
maxActive 8 The maximum number of active connections that can be allocated from this pool at the same time, or non-positive for no limit.
最大活动连接数,如果非正整数,则不做限制。
maxIdle 8 The maximum number of connections that can remain idle in the pool, without extra ones being released, or negative for no limit.
最大空闲连接数。
minIdle 0 The minimum number of connections that can remain idle in the pool, without extra ones being created, or zero to create none.
最小空闲连接数。
maxWait indefinitely The maximum number of milliseconds that the pool will wait (when there are no available connections) for a connection to be returned before throwing an exception, or -1 to wait indefinitely.
(在没有连接可用时)连接池等待一个数据连接可用时的以毫秒计的最大等待时间,超时以后抛出异常, -1 则将无限等待

实际上,Dbcp 依赖于 commons-pool 来存储连接对象。 BasicDataSource默认使用GenericObjectPool来管理连接对象。除了请求的线程会在请求和返回连接过程中影响池中连接实例外,另有一个跑着GenericObjectPool.Evictor类型 (implements Runnable) 的实例的线程,也会影响池中的数据库连接。

分享到:
评论

相关推荐

    DBCP数据库连接池jar包.zip

    总的来说,DBCP2是一个适用于学习和小型项目的数据库连接池实现,对于初学者来说,通过这个压缩包可以了解数据库连接池的基本工作原理和使用方式,对于开发者而言,它可以提供基本的数据库连接管理功能,但可能需要...

    dbcp连接池和配置文件

    **DBCP连接池的工作原理:** 1. **初始化**:在应用程序启动时,DBCP会预先创建一定数量的数据库连接并放入连接池。 2. **请求连接**:当程序需要与数据库交互时,它向连接池请求一个连接。连接池检查是否有空闲的...

    DBCP连接池所有jar包

    配置好这些jar包后,你可以在Java代码或应用服务器的配置文件中设置DBCP连接池的参数,然后在需要的地方通过DataSource对象获取数据库连接。 总的来说,DBCP连接池是Java Web开发中管理数据库连接的重要工具,通过...

    DBCP连接池的jar包

    DBCP连接池的工作原理是预先创建一定数量的数据库连接,将这些连接存储在一个池中,当应用需要连接数据库时,可以从池中获取一个已存在的连接,使用完毕后再归还到池中,而不是每次操作数据库都创建新的连接。...

    DBCP连接池jar包

    总之,DBCP作为一款经典的数据库连接池实现,虽然现在可能不是最佳选择,但其原理和使用方式对于理解数据库连接池的工作机制仍具有重要的学习价值。在实际项目中,开发者应根据需求和性能要求来选择合适的数据库连接...

    dbcp连接池使用例子

    在这个"dbcp连接池使用例子"中,我们将深入理解DBCP的工作原理、配置方法以及如何在实际项目中集成和使用。 DBCP连接池的基本概念: 1. 数据库连接池:在应用程序启动时,预先创建并维护一定数量的数据库连接,这些...

    dbcp 连接池 jar包

    DBCP连接池的工作原理是预先创建一定数量的数据库连接,并将这些连接保存在一个池中。当应用程序需要与数据库交互时,不再直接创建新的连接,而是从连接池中获取已存在的连接。使用完毕后,连接会被归还回池,而不是...

    DBCP连接池原理分析

    ### DBCP连接池原理分析 #### DBCP概述与版本区分 DBCP(Database Connection Pool)是由Apache组织提供的一款开源连接池实现。它能够帮助应用程序有效地管理与数据库的连接资源,通过重用预创建的数据库连接来...

    dbcp连接池jar,

    **DBCP连接池的工作原理:** DBCP连接池在应用启动时会预先创建一定数量的数据库连接,并将这些连接放入池中。当应用需要与数据库交互时,它从池中获取一个已建立的连接,用完后再归还回池,而不是每次操作都创建新...

    dbcp连接池jar

    DBCP(Database Connection Pool)是Apache组织提供的一种开源数据库连接池组件,主要...总的来说,DBCP连接池是Java应用程序中用于高效管理数据库连接的重要工具,通过合理的配置和使用,可以显著提升系统运行效率。

    DBCP数据库连接池

    4. **连接管理**:DBCP连接池会监控连接的状态,如果发现某个连接已经超时或者出现异常,会自动进行回收或重新建立,确保连接池中的连接始终处于可用状态。 5. **配置参数**:DBCP允许开发者通过配置参数来调整连接...

    commons中的DBCP连接池jar

    使用DBCP连接池的基本步骤如下: 1. 引入依赖:在项目中加入`commons-dbcp-1.4.jar`。 2. 配置连接池:创建一个配置对象,如`BasicDataSource`,设置数据库URL、用户名、密码、最大连接数等属性。 3. 获取数据库...

    dbcp连接池jar包和配置文件

    DBCP连接池是基于Jakarta POI项目中的DBCP组件发展而来的,适用于中小型系统的数据库连接管理。 1. **DBCP的工作原理** - 数据库连接池在初始化时会创建一定数量的数据库连接,并将这些连接保存在一个池中。当应用...

    DBCP(数据库连接池)

    DBCP,全称为Jakarta-Commons-DBCP,是一个基于Apache组织开发的开源数据库连接池组件。在Java应用程序中,DBCP可以帮助管理和优化数据库连接,提高应用性能和资源利用率。数据库连接池在多线程环境下尤其重要,因为...

    DBCP连接池帮助文档

    一、DBCP连接池原理 1. 连接初始化:当应用程序启动时,DBCP会预先创建一定数量的数据库连接并放入连接池中。这些连接在空闲时会被保持,等待后续请求。 2. 连接分配:当应用需要访问数据库时,会从连接池中获取一...

    dbcp数据库连接池

    **数据库连接池(DBCP)** 是一个在Java应用程序中管理数据库连接的工具,它能够有效地提高数据库操作的性能和效率。...理解和掌握DBCP的使用和配置,对于理解数据库连接池的工作原理和提升应用性能具有重要意义。

    常用数据库连接池 (DBCP、c3p0、Druid) 配置说明1

    本文主要探讨了三个常用的数据库连接池:DBCP、c3p0和Druid,以及它们的配置说明。 1. **DBCP(Apache Commons DBCP)** DBCP是Apache Commons项目的一部分,它依赖于Apache Commons Pool对象池机制来管理数据库...

    dbcp连接池所使用的jar和案例

    DBCP(Database Connection Pool...以上就是关于DBCP连接池的基本介绍、依赖库的作用以及如何在Java项目中使用DBCP进行数据库连接管理的相关知识点。理解并正确配置和使用DBCP,能够显著提升Java应用的数据库操作性能。

    自己封装的dbcp连接池封装,可以同时连接多个数据库

    3. **配置DBCP**:配置DBCP连接池通常涉及设置最大连接数、最小连接数、超时时间、测试SQL语句等参数。这些配置可以通过XML或Java代码进行。 4. **多数据库连接**:您的封装应该包含对多个数据库的支持,这意味着...

Global site tag (gtag.js) - Google Analytics