- 浏览: 249130 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
liuweihug:
这个博客不错。都是干货。Jquery+asp.net 后台数据 ...
jquery ajax 中文乱码 -
龙晓舟:
博主真不错!请问,德比的酒店系统有单体店的吗?支持多语言吗?那 ...
我的作品 -
勒布朗-小明:
抽象工厂模式 的例子在哪呢??
Java工厂模式 factory -
llpuya:
hh
Java工厂模式 factory -
phpxiaoxin:
yuhe 写道git init --bare 执行不成功呢?错 ...
git at redhat5
转自http://baike.baidu.com/view/1528732.htm
连接池的好处
连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。
这种把连接“
汇集”
起来的技术基于这样的一个事实:对于大多数应用程序,当它们正在处理通常需要数毫秒完成的事务时,仅需要能够访问JDBC
连接的 1
个线程。当不处理事务时,这个连接就会闲置。相反,连接池允许闲置的连接被其它需要的线程使用。
事实上,当一个线程需要用 JDBC
对一个 GBase
或其它数据库操作时,它从池中请求一个连接。当这个线程使用完了这个连接,将它返回到连接池中,这样这就可以被其它想使用它的线程使用。
当连接从池中“
借出”
,它被请求它的线程专有地使用。从编程的角度来看,这和用户的线程每当需要一个 JDBC
连接的时候调用DriverManager.getConnection()
是一样的,采用连接池技术,可通过使用新的或已有的连接结束线程。
连接池可以极大的改善用户的 Java
应用程序的性能,同时减少全部资源的使用。连接池主要的优点有:
减少连接创建时间
虽然与其它数据库相比 GBase
提供了较为快速连接功能,但是创建新的 JDBC
连接仍会招致网络和 JDBC
驱动的开销。如果这类连接是“
循环”
使用的,使用该方式这些花销就可避免。
简化的编程模式
当使用连接池时,每一个单独的线程能够像创建了一个自己的 JDBC
连接一样操作,允许用户直接使用JDBC
编程技术。
受控的资源使用
如果用户不使用连接池,而是每当线程需要时创建一个新的连接,那么用户的应用程序的资源使用会产生非常大的浪费并由可能会导致高负载下的异常发生。
注意,每个连到 GBase
的连接在客户端和服务器端都有花销(内存,CPU
,上下文切换等等)。每个连接均会对应用程序和 GBase
服务器的可用资源带来一定的限制。不管这些连接是否在做有用的工作,仍将使用这些资源中的相当一部分。
连接池能够使性能最大化,同时还能将资源利用控制在一定的水平之下,如果超过该水平,应用程序将崩溃而不仅仅是变慢。
连接池运作原理
在实际应用开发中,特别是在WEB
应用系统中,如果JSP
、Servlet
或EJB
使用JDBC
直接访问数据库中的数据,每一次数据访问请求都必须经历
建立数据库连接、打开数据库、存取数据和关闭数据库连接等步骤,而连接并打开数据库是一件既消耗资源又费时的工作,如果频繁发生这种数据库操作,系统的性 能必然会急剧下降,甚至会导致系统崩溃。数据库连接池技术是解决这个问题最常用的方法,在许多应用程序服务器(例
如:Weblogic,WebSphere,JBoss
)中,基本都提供了这项技术,无需自己编程,但是,深入了解这项技术是非常必要的。
数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个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)//
装载数据库驱动程序
}
3
、连接池使用
上面所实现的连接池在程序开发时如何应用到系统中呢?下面以Servlet
为例说明连接池的使用。
Servlet
的生命周期是:在开始建立servlet
时,调用其初始化(init
)方法。之 后每个用户请求都导致一个调用前面建立的实例的service
方法的线程。最后,当服务器决定卸载一个servlet
时,它首先调用该servlet
的 destroy
方法。
根据servlet
的特点,我们可以在初始化函数中生成连接池管理类的唯一实例(其中包括创建一个或多个连接池)。如:
public void init() throws ServletException
{
connMgr = DBConnectionManager.getInstance();
}
然后就可以在service
方法中通过连接池名称使用连接池,执行数据库操作。最后在destroy
方法中释放占用的系统资源,如:
public void destroy() {
connMgr.release(); super.destroy();
}
结束语
在使用JDBC
进行与数据库有关的应用开发中,数据库连接的管理是一个难点。很多时候,连接的混乱管理所造成的系统资源开销过大成为制约大型企业级应用
效率的瓶颈。对于众多用户访问的Web
应用,采用数据库连接技术的系统在效率和稳定性上比采用传统的其他方式的系统要好很多。本文阐述了使用JDBC
访问 数据库的技术?
讨论了基于连接池技术的数据库连接管理的关键问题并给出了一个实现模型。文章所给出的是连接池管理程序的一种基本模式,为提高系统的整体性
能,在此基础上还可以进行很多有意义的扩展。
http://www.webdevelopersjournal.com/columns/connection_pool.html
http://www.webdevelopersjournal.com/columns/DBConnectionManager.java
发表评论
-
关于ThreadLocal
2012-12-31 18:45 1149关于ThreadLocal 文章介绍了ThreadLo ... -
java 关于内存溢出的相关知识
2012-12-27 16:31 1189http://developer.51cto.c ... -
一次webservice的旅行
2012-12-25 16:19 0最近我们有这样一个需求,就是发布一个与别人一模一样的webse ... -
scala 相关内容整理
2012-07-11 21:18 1391首先是scala 的环境搭建 :鉴客 搭建基于 IDEA 的 ... -
Hibernate DetachedCriteria 一对多查询
2011-05-31 10:50 2794DetachedCriteria detachedCrit ... -
cxf spring 发布 webservice 供 .net使用
2010-12-31 21:23 2450cxf 是 xfire 的替代工具 ... -
spring proxyTargetClass 动态代理
2010-12-13 20:25 3317今天做两个项目的集成,主项目单独跑没问题,子项目单独跑没问题, ... -
spring事务无异常回滚 [spring rollback without exception]
2010-12-13 16:54 2305在使用spring的时候通常我们可以通过抛出异常的方式完成回滚 ... -
都是spring若的祸-spring从使用到原理
2010-06-07 10:46 0spring2.5中文文档 http://arro ... -
从ant到maven -- maven pom例子(初级)
2010-04-20 14:31 7417最近将项目从ant改成了maven,改的过程中,遇到一些问题, ... -
MAVEN2实用指南, maven2权威指南中英
2010-04-06 11:06 2056maven2权威指南中英 :http://xizhenyin. ... -
Java 回调(callback) 内部类(innerclass)
2009-12-22 21:01 1561/** * 动物 */ public class A ... -
Struts2
2009-11-03 17:30 1297struts2 中 OGNL表达式的使用 http ... -
HttpInvoker 远程调用
2009-10-20 19:35 1851HttpInvoker 远程调用实例 http://www. ... -
java 基础概念知识
2009-10-20 14:55 1832java 泛型 http://baike.baidu.com ... -
spring BeanFactory 实现类的getBean方法
2009-10-10 10:59 3088原文:http://blog.163.com/ka ... -
java 面试基础
2009-09-08 11:04 1142ArrayList LinkedList 的区 ... -
guice:Guice和Spring框架的区别
2009-09-02 17:55 1435转自:http://www.crazycoder.cn/ :h ... -
第一次java web面试总结
2009-07-31 13:12 4462公司为某大公司济南的 ... -
关于tomcate配置的一些东西
2009-07-13 10:51 1294乱码问题,这里说的是url乱码的解决方式可以通过配置tomca ...
相关推荐
对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接的配置,实现数据库连接池技术。某一应用最大可用数据库连接数的限制,避免某一应用独占所有数据库资源。 在较为完备的数据库连接池实现中,可根据...
连接池案例
连接池连接池连接池连接池连接池
传统的HttpURLConnection并不支持连接池,如果要实现连接池的机制,还需要自己来管理连接对象。对于网络请求这种底层相对复杂的操作,个人以为如果有可用的其他方案,也没有必要自己去管理连接对象。 除了...
* 数据库连接池特点: * 获取连接时不需要了解连接的名字,连接池内部维护连接的名字 * 支持多线程,保证获取到的连接一定是没有被其他线程正在使用 * 按需创建连接,可以创建多个连接,可以控制连接的数量 * 连接...
使用JDK1.8、SpringBoot2.2.10.RELEASE、lombok1.18.8、guava23.0、hutool5.3.10、commons-pool2 2.7.0、tika1.22等实现多Ftp连接池实现,通过守护线程实现连接池内连接可用性校验,配置最大、最小连接个数防止Ftp...
ADO.NET链接对象(SqlConnection或者OracleConnection)默认情况都开启连接池(平时编程时可能会忽略)。当我们调用Close或者Dispose方法时,实际并不断开连接,而是把连接放回连接池,再次使用时候重连接池中取得...
v1.3改进了清理线程可能出现的减少连接池中链接而不计数的问题。 v1.2处理了oracle环境下由于服务器关闭休眠链接造成的连接池循环检测进程异常退出的情况,改为当循环周期大于服务器关闭休眠链接间隔时,后台打印...
经过几天的琢磨,去看了csdn上一位大牛的数据库的连接池实现方案,从中感悟很多,感谢这位大神。 让我才能有信心去坚持下去。也不知道写的好不好··不好的话,大家指出。但是我是努力去做了,这一个过程,很享受,...
封装抽取了一个kafka生产者的连接池,能很好的用池的方式对kafka生产者连接点进行有效的管理
C# 数据库连接池 C# 数据库连接池 C# 数据库连接池 C# 数据库连接池
这个文档详细讲述了mysql数据库连接池的配置以及数据库连接池的工作原理。
C#高效数据库连接池源码
Tomcat6配置连接池很全面的东东
代码中包含okhhtp中连接池的设计,包含连接对象的添加,连接对象何时被移除。
这是用连接池技术管理连接oracle数据库的工具类代码,如果想连接MySQL,直接修改配置文件即可。
RabbitMQ连接池+SpringBoot实现。通过连接池实现将高效的管理RabbitMQ的Connection,并与springboot进行整合,实现消息发送,获取队列列表等功能。基于此可以进行更多功能的扩充。
在网上找了好久没有现成的ftp连接池jar包,自己花了一些时间实现了一个简单的连接池,用了一段时间稳定性还可以。
Hibernate支持第三方的连接池,官方推荐的连接池是C3P0,Proxool,以及DBCP 在配置连接池时需要注意的有三点: 一、Apche的DBCP在Hibernate2中受支持,但在Hibernate3中已经不再推荐使用,官方的解释是这个连接池存在...
java 数据库 连接池驱动.rar java 数据库 连接池驱动.rar java 数据库 连接池驱动.rar