数据库连接池

来源:互联网 发布:淘宝客服链接 编辑:程序博客网 时间:2024/06/04 00:40

简介

数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
数据库连接池技术带来的优势:
1.资源重用
2.更快的系统响应速度
3.新的资源分配手段
4.统一的连接管理,避免数据库连接泄露
影响因素有:
1.最小连接数
2.最大连接数
3.最小连接数与最大连接数的差距
  最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放

原理

连接池的出现是为了用户频繁访问数据库而造成速度和性能上的迟缓才对访问数据库的方法作了一点修改,这个修改就是把原本要关闭的Connection对象放到Collection集合里以重复利用。

(1) 程序初始化时创建连接池
(2) 使用时向连接池申请可用连接
(3) 使用完毕,将连接返还给连接池
(4) 程序退出时,断开所有连接,并释放资源

常用的数据库连接池:

1.DBCP: apache(Tomcat的连接池)
DataBase connection pool数据库连接池,是apache上一个java连接池项目,也是tomcat使用的连接池组件。单独使用dbcp需要三个包:common-dbcp.jar,common-pool.jar,common-collections.jar.dbcp。没有自动的去回收空闲连接的功能。
2.C3P0:
C3P0是一个开源的jdbc连接池,实现了数据源和jndi绑定,支持jdbc3规范和jdbc2的标准扩展。c3p0是异步性的,缓慢的jdbc操作通过帮助进程完成。扩展这些操作可以有效的提升性能。目前使用它的开源项目有:Hibernate,Spring等。C3P0有自动回收空闲连接的功能。
ps:JNDI(Java Naming and Directory Interface,java命名和目录接口)是SUN公司提供的一种标准的Java的命名系统接口
3.Druid
Druid不仅是一个数据库连接池,还包含一个ProxyDriver、一系列内置的JDBC组件库,一个SQLParser、支持所有的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的抽象语法树很方便。

常见数据库连接池基本步骤

(1)创建ConnectionPool实例,并初始化创建连接个数
(2)实现getConnenction()从连接中获取一个可用的连接。
实现DateSourse接口并实现getConnenction方法
(3)returnConnection(conn)提供将连接放回连接池中方法
ps:dataSourse数据源是指数据库应用所使用的数据库或数据库服务器。
在数据源中存储了所有建立数据库连接的信息,就像通过指定文件名称可以在文件系统一样,通过提供正确的数据源名称,就可以找到相应的数据库连接。
数据源提供了一个简单的获取数据库连接的方式,并能在内部通过一个池的机制来复用数据库连接,这样就大大减少创建数据库连接的次数,提高了系统性能。

Mxy
9月 16, 2017

1.什么是数据库连接池

数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
2.为什么使用数据库连接池

对于Java程序开发,每一次web请求都要建立一次数据库连接。建立连接是一个费时的活动,每次都得花费0.05s~1s的时间,而且系统还要分配内存资源。这个时间对于一次或几次数据库操作,或许感觉不出系统有多大的开销。可是对于现在的web应用,尤其是大型电子商务网站,同时有几百人甚至几千人在线是很正常的事。在这种情况下,频繁的进行数据库连接操作势必占用很多的系统资源,网站的响应速度必定下降,严重的甚至会造成服务器的崩溃.

简言之:
数据库连接是一种关键的、有限的、昂贵的资源.创建数据库连接是一个很耗时的操作,频繁的操作数据库是一个很耗费资源的行为, 网站的响应的速度也会下降,严重的时候可能导致服务器崩溃,也容易对数据库造成安全隐患。使用数据库连接池可以节省系统的许多的开销.
3. 数据库连接池技术带来的优势:
1. 资源重用

由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增进了系统运行环境的平稳性(减少内存碎片以及数据库临时进程/线程的数量)。
2. 更快的系统响应速度

数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。
3. 新的资源分配手段

对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接的配置,实现数据库连接池技术,几年钱也许还是个新鲜话题,对于目前的业务系统而言,如果设计中还没有考虑到连接池的应用,那么…….快在设计文档中加上这部分的内容吧。某一应用最大可用数据库连接数的限制,避免某一应用独占所有数据库资源。
4. 统一的连接管理,避免数据库连接泄漏

在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接。从而避免了常规数据库连接操作中可能出现的资源泄漏。

注: 数据库连接泄漏 指的是如果在某次使用或者某段程序中没有正确地关Connection、Statement和ResultSet资源,那么每次执行都会留下一些没有关闭的连接,这些连接失去了引用而不能得到重新使用,因此就造成了数据库连接的泄漏。
数据库连接的资源是宝贵而且是有限的,如果在某段使用频率很高的代码中出现这种泄漏,那么数据库连接资源将被耗尽,影响系统的正常运转。我们可根据预先的连接占用超时设定,强制收回被占用连接。从而避免了常规数据库连接操作中可能出现的资源泄漏。
4.影响因素
1. 最小连接数

是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费。
2. 最大连接数

是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。
3. 最小连接数与最大连接数差距

最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放
4.原理

连接池的核心思想是链接复用、减少链接的建立; 基本思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用.
简言之:
连接池的出现是为了用户频繁访问数据库而造成速度和性能上的迟缓才对访问数据库的方法作了一点修改,这个修改就是把原本要关闭的Connection对象放到Collection集合里以重复利用。

(1) 程序初始化时创建连接池
(2) 使用时向连接池申请可用连接
(3) 使用完毕,将连接返还给连接池
(4) 程序退出时,断开所有连接,并释放资源
5.常用的数据库连接池:
1、 DBCP:apache(Tomcat的连接池)

DBCP(DataBase connection pool)数据库连接池。是apache上的一个 java连接池项目,也是 tomcat使用的连接池组件。单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar.dbcp没有自动的去回收空闲连接的功能。
2、 C3P0:

C3P0是一个开源的jdbc连接池,它实现了数据源和jndi绑定,支持jdbc3规范和jdbc2的标准扩展。c3p0是异步操作的,缓慢的jdbc操作通过帮助进程完成。扩展这些操作可以有效的提升性能。目前使用它的开源项目有Hibernate,Spring等。c3p0有自动回收空闲连接功能。
注: JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口.
3. Druid

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微秒。
6. 常见数据库连接池的三大步骤:

① 创建ConnectionPool实例,并初始化创建连接个数;
②实现getConnection()从连接库中获取一个可用的连接
GetConnenction是DataSource接口中的接口, 实现DataSource接口并实现getConnenction方法.
③returnConnection(conn)提供将连接放回连接池中方法
注: dateSource 数据源
数据源是指数据库应用程序所使用的数据库或者数据库服务器。
在数据源中存储了所有建立数据库连接的信息。就像通过指定文件名称可以在文件系统中找到文件一样,通过提供正确的数据源名称,你可以找到相应的数据库接。
数据源提供了一种简单获取数据库连接的方式,并能在内部通过一个池的机制来复用数据库连接,这样就大大减少创建数据库连接的次数,提高了系统性能。

Druid 官方文档
https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
Druid 简介 优点 一些结构
http://www.infoq.com/cn/news/2015/04/druid-data/
数据库连接池 比较通俗易懂的文章
http://blog.csdn.net/u011918260/article/details/52022397
Druid 简单案例
http://blog.csdn.net/super_ccc/article/details/50519926
数据库阿里连接池 druid配置详解
http://blog.csdn.net/hj7jay/article/details/51686418
Druid的图解的一些使用案例
http://www.cnblogs.com/xdp-gacl/p/4002804.html
代码实现数据库连接池(没有报错的)
http://blog.csdn.net/mlc1218559742/article/details/54955965
http://blog.csdn.net/mlc1218559742/article/details/54955965

原创粉丝点击