数据库连接池

这篇博客介绍了数据库连接池的概念,三大主流连接池c3p0、DBCP和Druid的特点,以及Druid的详细属性说明。连接池通过复用已建立的数据库连接,提高系统资源利用率。配置包括基本配置、关键配置和性能配置,如最小和最大连接数、超时检测等。此外,还概述了连接池的工作流程和实现模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

三大连接池:c3p0,dbcp与druid

原理:
连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等,也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。
1)DBCP
  DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序中使用,Tomcat的数据源使用的就是DBCP。
 2)c3p0
  c3p0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。
3)Druid
  阿里出品,淘宝和支付宝专用数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个 SQL Parser。支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。Druid针对Oracle和MySql做了特别优化,比如Oracle的PS
Cache内存占用优化,MySql的ping检测优化。Druid提供了MySql、Oracle、Postgresql、SQL-92的SQL的完整支持,这是一个手写的高性能SQL Parser,支持Visitor模式,使得分析SQL的抽象语法树很方便。简单SQL语句用时10微秒以内,复杂SQL用时30微秒。通过Druid提供的SQL Parser可以在JDBC层拦截SQL做相应处理,比如说分库分表、审计等。Druid防御SQL注入攻击的WallFilter就是通过Druid的SQL Parser分析语义实现的。

连接池配置大体可以分为基本配置、关键配置、性能配置等主要配置

1) 基本配置
  传递给JDBC驱动的用于连接数据库的用户名、密码、URL以及驱动类名。

               DBCP                       c3p0                         Druid
用户名:        username                       user                       username
密码  :           password                 password                    password
URL :           url                       jdbcUrl                    jdbcUrl
驱动类名:   driverClassName             driverClass               driverClassName

2) 关键配置
为了发挥数据库连接池的作用,在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数 据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池。
属性:最小连接数、初始化连接数、最大连接数、最大等待时间

3) 性能配置
预缓存设置(vip无)
连接有效性检测设置
  连接池内部有机制判断,如果当前的总的连接数少于miniIdle,则会建立新的空闲连接,以保证连接数得到miniIdle。如果当前连接池中某 个连接在空闲了timeBetweenEvictionRunsMillis时间后任然没有使用,则被物理性的关闭掉。有些数据库连接的时候有超时限制
(mysql连接在8小时后断开),或者由于网络中断等原因,连接池的连接会出现失效的情况,这时候设置一个testWhileIdle参数为true, 可以保证连接池内部定时检测连接的可用性,不可用的连接会被抛弃或者重建,最大情况的保证从连接池中得到的Connection对象是可用的。当然,为了 保证绝对的可用性,你也可以使用testOnBorrow为true(即在获取Connection对象时检测其可用性),不过这样会影响性能。
DBCP c3p0 Druid
申请连接检测 testOnBorrow testConnectionOnCheckin testOnBorrow
是否超时检测 testWhileIdle testWhileIdle
空闲时间 timeBetweenEvictionRunsMillis idleConnectionTestPeriod timeBetweenEvictionRunsMillis
校验用sql语句 validationQuery preferredTestQuery validationQuery
归还连接检测 testOnReturn testConnectionOnCheckout testOnReturn

                DBCP                              c3p0                         Druid
申请连接检测  testOnBorrow                    testConnectionOnCheckin          testOnBorrow
是否超时检测  testWhileIdle                                                   testWhileIdle
空闲时间      timeBetweenEvictionRunsMillis  idleConnectionTestPeriod   timeBetweenEvictionRunsMillis
校验用sql语句    validationQuery                  preferredTestQuery         validationQuery
归还连接检测  testOnReturn                    testConnectionOnCheckout        testOnReturn

  超时连接关闭设置(vip无)

DRUID 属性说明表(vip封装的连接池的底层就是druid)

这里写图片描述

以上参考文献:http://www.cnblogs.com/JavaSubin/p/5294721.html


接下来要重点讲解数据库连接池的方方面面细节了!


思想

数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vector对象中,一旦数据库连接建立后,不同的数据库访问请求就可以共享这些连接,这样,通过复用这些已经建立的数据库连接,可以克服上述缺点,极大地节省系统资源和时间。

主要操作

  (1)建立数据库连接池对象(服务器启动)。
  (2)按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)。
  (3)对于一个数据库访问请求,直接从连接池中得到一个连接。如果数据库连接池对象中没有空闲的连接,且连接数没有达到最大(即:最大活跃连接数),创建一个新的数据库连接。
  (4)存取数据库。
  (5)关闭数据库,释放所有数据库连接(此时的关闭数据库连接,并非真正关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)。
  (6)释放数据库连接池对象(服务器停止、维护期间,释放数据库连接池对象,并释放所有连接)。

连接池的实现

 1、连接池模型
本文讨论的连接池包括一个连接池类(DBConnectionPool)和一个连接池管理类(DBConnetionPoolManager)。连接池类是对某一数据库所有连接的“缓冲池”,主要实现以下功能:
①从连接池获取或创建可用连接;
②使用完毕之后,把连接返还给连接池;
③在系统关闭前,断开所有连接并释放连接占用的系统资源;
④还能够处理无效连接(原来登记为可用的连接,由于某种原因不再可用,如超时,通讯问题),并能够限制连接池中的连接总数不低于某个预定值和不超过某个预定值。
  连接池管理类是连接池类的外覆类(wrapper),符合单例模式,即系统中只能有一个连接池管理类的实例。其主要用于对多个连接池对象的管理,具有以下功能:
  ①装载并注册特定数据库的JDBC驱动程序;
  ②根据属性文件给定的信息,创建连接池对象;
  ③为方便管理多个连接池对象,为每一个连接池对象取一个名字,实现连接池名字与其实例之间的映射;
  ④跟踪客户使用连接情况,以便需要是关闭连接释放资源。
  连接池管理类的引入主要是为了方便对多个连接池的使用和管理,如系统需要连接不同的数据库,或连接相同的数据库但由于安全性问题,需要不同的用户使用不同的名称和密码。
  2、连接池实现
  下面给出连接池类和连接池管理类的主要属性及所要实现的基本接口:

public class DBConnectionPool implements TimerListener{
    private int checkedOut;//已被分配出去的连接数
    //容器,空闲池,根据创建时间顺序存放已创建但尚未分配出去的连接
    private ArrayList freeConnections = new ArrayList();
    private int minConn;//连接池里连接的最小数量
    private int maxConn;//连接池里允许存在的最大连接数
    private String name;//为这个连接池取个名字,方便管理
    private String password;//连接数据库时需要的密码
    private String url;//所要创建连接的数据库的地址
    private String user;//连接数据库时需要的用户名
    public Timer timer;//定时器
    public DBConnectionPool(String name, String URL, String user, String password, int maxConn)//公开的构造函数
    public synchronized void freeConnection(Connection con) //使用完毕之后,把连接返还给空闲池
    public synchronized Connection getConnection(long timeout)//得到一个连接,timeout是等待时间
    public synchronized void release()//断开所有连接,释放占用的系统资源
    private Connection newConnection()//新建一个数据库连接
    public synchronized void TimerEvent() //定时器事件处理函数
}

public class DBConnectionManager {
    static private DBConnectionManager instance;//连接池管理类的唯一实例
    static private int clients;//客户数量
    private ArrayList drivers = new ArrayList();//容器,存放数据库驱动程序
    private HashMap pools = new HashMap ();//以name/value的形式存取连接池对象的名字及连接池对象
    static synchronized public DBConnectionManager getInstance()//如果唯一的实例instance已经创建,直接返回这个实例;否则,调用私有构造函数,创建连接池管理类的唯一实例
    private DBConnectionManager()//私有构造函数,在其中调用初始化函数init()
    public void freeConnection(String name, Connection con)// 释放一个连接,name是一个连接池对象的名字
    public Connection getConnection(String name)//从名字为name的连接池对象中得到一个连接
    public Connection getConnection(String name, long time)//从名字为name的连接池对象中取得一个连接,time是等待时间
    public synchronized void release()//释放所有资源
    private void createPools(Properties props)//根据属性文件提供的信息,创建一个或多个连接池
    private void init()//初始化连接池管理类的唯一实例,由私有构造函数调用
    private void loadDrivers(Properties props)//装载数据库驱动程序
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值