概述
数据库链接池负责分配、管理和释放数据库链接,它容许应用程序重复使用一个现有的数据库链接,而不是再从新创建一个;释放空闲时间超过最大空闲时间的数据库链接来避免由于没有释放数据库链接而引发的数据库链接遗漏。 这项技术能明显提升对数据库操做的性能。它其实就是一个容器,用来存放数据库链接对象的容器。java
背景
数据库链接是一种关键的、有限的、昂贵的资源,这一点在多用户的网页应用程序中体现得尤其突出。对数据库链接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库链接池正是针对这个问题提出来的。sql
影响因素
数据库链接池在初始化时将建立必定数量的数据库链接放到链接池中,这些数据库链接的数量是由最小数据库链接数制约。不管这些数据库链接是否被使用,链接池都将一直保证至少拥有这么多的链接数量。链接池的最大数据库链接数量限定了这个链接池能占有的最大链接数,当应用程序向链接池请求的链接数超过最大链接数量时,这些请求将被加入到等待队列中。数据库链接池的最小链接数和最大链接数的设置要考虑到下列几个因素:数据库
最小链接数
是链接池一直保持的数据库链接,因此若是应用程序对数据库链接的使用量不大,将会有大量的数据库链接资源被浪费。服务器
最大链接数
是链接池能申请的最大链接数,若是数据库链接请求超过此数,后面的数据库链接请求将被加入到等待队列中,这会影响以后的数据库操做。工具
最小链接数与最大链接数差距
最小链接数与最大链接数相差太大,那么最早的链接请求将会获利,以后超过最小链接数量的链接请求等价于创建一个新的数据库链接。不过,这些大于最小链接数的数据库链接在使用完不会立刻被释放,它将被放到链接池中等待重复使用或是空闲超时后被释放。
原理
链接池基本的思想是在系统初始化的时候,将数据库链接做为对象存储在内存中,当用户须要访问数据库时,并不是创建一个新的链接,而是从链接池中取出一个已创建的空闲链接对象。使用完毕后,用户也并不是将链接关闭,而是将链接放回链接池中,以供下一个请求访问使用。而链接的创建、断开都由链接池自身来管理。同时,还能够经过设置链接池的参数来控制链接池中的初始链接数、链接的上下限数以及每一个链接的最大使用次数、最大空闲时间等等。也能够经过其自身的管理机制来监视数据库链接的数量、使用状况等。性能
Java中的数据库链接池
- C3P0:是一个开放源代码的JDBC链接池,它在lib目录中与Hibernate一块儿发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。
- Proxool:是一个Java SQL Driver驱动程序,提供了对选择的其它类型的驱动程序的链接池封装。能够很是简单的移植到现存的代码中,彻底可配置,快速、成熟、健壮。能够透明地为现存的JDBC驱动程序增长链接池功能。
- Jakarta DBCP:DBCP是一个依赖Jakartacommons-pool对象池机制的数据库链接池。DBCP能够直接的在应用程序中使用。
- DDConnectionBroker:是一个简单、轻量级的数据库链接池。
- DBPool:是一个高效、易配置的数据库链接池。它除了支持链接池应有的功能以外,还包括了一个对象池,使用户可以开发一个知足本身需求的数据库链接池。
- XAPool:是一个XA数据库链接池。它实现了javax.sql.XADataSource并提供了链接池工具。
- Primrose:是一个Java开发的数据库链接池。当前支持的容器包括Tomcat4&五、Resin3与JBoss3。它一样也有一个独立的版本,能够在应用程序中使用而没必要运行在容器中。Primrose经过一个WEB接口来控制SQL处理的追踪、配置,以及动态池管理。在重负荷的状况下可进行链接请求队列处理。
- SmartPool:是一个链接池组件,它模仿应用服务器对象池的特性。SmartPool可以解决一些临界问题如链接泄漏(connection leaks)、链接阻塞、打开的JDBC对象(如Statements、PreparedStatements)等。SmartPool的特性包括:
- 支持多个pool
- 自动关闭相关联的JDBC对象
- 在所设定time-outs以后察觉链接泄漏
- 追踪链接使用状况
- 强制启用最近最少用到的链接
- 把SmartPool“包装”成现存的一个pool
- MiniConnectionPoolManager:是一个轻量级JDBC数据库链接池。它只须要Java1.5(或更高)而且没有依赖第三方包。
- BoneCP:是一个快速、开源的数据库链接池。帮用户管理数据链接,让应用程序能更快速地访问数据库。比C3P0/DBCP链接池速度快25倍。
-
Druid:Druid不只是一个数据库链接池,还包含一个ProxyDriver、一系列内置的JDBC组件库、一个SQL Parser。
支持全部JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等。针对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分析语义实现的。ui