用户每次请求都须要向数据库得到连接,而数据库建立链接一般须要消耗相对较大的资源,建立时间也较长。假设网站一天10万访问量,数据库服务器就须要建立10万次链接,极大的浪费数据库的资源,而且极易形成数据库服务器内存溢出、拓机。以下图所示:java
数据库链接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤其突出.对数据库链接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库链接池正式针对这个问题提出来的.数据库链接池负责分配,管理和释放数据库链接,它容许应用程序重复使用一个现有的数据库链接,而不是从新创建一个。以下图所示:sql
数据库链接池在初始化时将建立必定数量的数据库链接放到链接池中, 这些数据库链接的数量是由最小数据库链接数来设定的.不管这些数据库链接是否被使用,链接池都将一直保证至少拥有这么多的链接数量.链接池的最大数据库链接数量限定了这个链接池能占有的最大链接数,当应用程序向链接池请求的链接数超过最大链接数量时,这些请求将被加入到等待队列中.数据库
数据库链接池的最小链接数和最大链接数的设置要考虑到如下几个因素:编程
最小链接数:是链接池一直保持的数据库链接,因此若是应用程序对数据库链接的使用量不大,将会有大量的数据库链接资源被浪费.服务器
最大链接数:是链接池能申请的最大链接数,若是数据库链接请求超过次数,后面的数据库链接请求将被加入到等待队列中,这会影响之后的数据库操做oracle
若是最小链接数与最大链接数相差很大:那么最早链接请求将会获利,以后超过最小链接数量的链接请求等价于创建一个新的数据库链接.不过,这些大于最小链接数的数据库链接在使用完不会立刻被释放,他将被放到链接池中等待重复使用或是空间超时后被释放.函数
编写链接池需实现java.sql.DataSource接口。DataSource接口中定义了两个重载的getConnection方法:性能
Connection getConnection()大数据
Connection getConnection(String username, String password) 优化
实现DataSource接口,并实现链接池功能的步骤:
在DataSource构造函数中批量建立与数据库的链接,并把建立的链接加入LinkedList对象中。
实现getConnection方法,让getConnection方法每次调用时,从LinkedList中取一个Connection返回给用户。
当用户使用完Connection,调用Connection.close()方法时,Collection对象应保证将本身返回到LinkedList中,而不要把conn还给数据库。Collection保证将本身返回到LinkedList中是此处编程的难点。
如今不少WEB服务器(Weblogic, WebSphere, Tomcat)都提供了DataSoruce的实现,即链接池的实现。一般咱们把DataSource的实现,按其英文含义称之为数据源,数据源中都包含了数据库链接池的实现。
也有一些开源组织提供了数据源的独立实现:
DBCP 数据库链接池
C3P0 数据库链接池
在使用了数据库链接池以后,在项目的实际开发中就不须要编写链接数据库的代码了,直接从数据源得到数据库的链接。
DBCP 是 Apache 软件基金组织下的开源链接池实现,要使用DBCP数据源,须要应用程序应在系统中增长以下两个 jar 文件:
Commons-dbcp.jar:链接池的实现
Commons-pool.jar:链接池实现的依赖库
Tomcat 的链接池正是采用该链接池来实现的。该数据库链接池既能够与应用服务器整合使用,也可由应用程序独立使用。
C3P0是一个开源的JDBC链接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。C3P0数据源在项目开发中使用得比较多。
导入相关jar包 :
c3p0-0.9.2-pre1.jar、mchange-commons-0.2.jar,若是操做的是Oracle数据库,那么还须要导入c3p0-oracle-thin-extras-0.9.2-pre1.jar 。
c3p0与dbcp区别 :
dbcp没有自动回收空闲链接的功能
c3p0有自动回收空闲链接功能
在实际开发中,咱们有时候还会使用服务器提供给咱们的数据库链接池,好比咱们但愿Tomcat服务器在启动的时候能够帮咱们建立一个数据库链接池,那么咱们在应用程序中就不须要手动去建立数据库链接池,直接使用Tomcat服务器建立好的数据库链接池便可。要想让Tomcat服务器在启动的时候帮咱们建立一个数据库链接池,那么须要简单配置一下Tomcat服务器。
JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.naming包。
这套API的主要做用在于:它能够把Java对象放在一个容器中(JNDI容器),并为容器中的java对象取一个名称,之后程序想得到Java对象,只需 经过名称检索便可。其核心API为Context,它表明JNDI容器,其lookup方法为检索容器中对应名称的对象。
Tomcat服务器建立的数据源是以JNDI资源的形式发布的,因此说在Tomat服务器中配置一个数据源实际上就是在配置一个JNDI资源。