- 浏览: 253019 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
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 1182关于ThreadLocal 文章介绍了ThreadLo ... -
java 关于内存溢出的相关知识
2012-12-27 16:31 1246http://developer.51cto.c ... -
一次webservice的旅行
2012-12-25 16:19 0最近我们有这样一个需求,就是发布一个与别人一模一样的webse ... -
scala 相关内容整理
2012-07-11 21:18 1462首先是scala 的环境搭建 :鉴客 搭建基于 IDEA 的 ... -
Hibernate DetachedCriteria 一对多查询
2011-05-31 10:50 2875DetachedCriteria detachedCrit ... -
cxf spring 发布 webservice 供 .net使用
2010-12-31 21:23 2504cxf 是 xfire 的替代工具 ... -
spring proxyTargetClass 动态代理
2010-12-13 20:25 3420今天做两个项目的集成,主项目单独跑没问题,子项目单独跑没问题, ... -
spring事务无异常回滚 [spring rollback without exception]
2010-12-13 16:54 2402在使用spring的时候通常我们可以通过抛出异常的方式完成回滚 ... -
都是spring若的祸-spring从使用到原理
2010-06-07 10:46 0spring2.5中文文档 http://arro ... -
从ant到maven -- maven pom例子(初级)
2010-04-20 14:31 7490最近将项目从ant改成了maven,改的过程中,遇到一些问题, ... -
MAVEN2实用指南, maven2权威指南中英
2010-04-06 11:06 2114maven2权威指南中英 :http://xizhenyin. ... -
Java 回调(callback) 内部类(innerclass)
2009-12-22 21:01 1617/** * 动物 */ public class A ... -
Struts2
2009-11-03 17:30 1380struts2 中 OGNL表达式的使用 http ... -
HttpInvoker 远程调用
2009-10-20 19:35 1939HttpInvoker 远程调用实例 http://www. ... -
java 基础概念知识
2009-10-20 14:55 1871java 泛型 http://baike.baidu.com ... -
spring BeanFactory 实现类的getBean方法
2009-10-10 10:59 3139原文:http://blog.163.com/ka ... -
java 面试基础
2009-09-08 11:04 1206ArrayList LinkedList 的区 ... -
guice:Guice和Spring框架的区别
2009-09-02 17:55 1513转自:http://www.crazycoder.cn/ :h ... -
第一次java web面试总结
2009-07-31 13:12 4544公司为某大公司济南的 ... -
关于tomcate配置的一些东西
2009-07-13 10:51 1343乱码问题,这里说的是url乱码的解决方式可以通过配置tomca ...
相关推荐
在IT行业中,数据库连接池是优化数据库访问性能和资源管理的重要技术。连接池的基本思想是重用已建立的数据库连接,避免频繁创建和销毁连接带来的性能开销。本篇文章将深入探讨连接池的概念、工作原理以及如何在实际...
为了优化性能和提高效率,开发人员常常会利用连接池技术来管理Kafka生产者的连接。本文将深入探讨"Kafka生产者连接池"的概念、实现原理以及它如何提升系统性能。 Kafka生产者连接池是一种资源复用机制,它允许多个...
它的核心特性之一就是连接池(Connection Pool),它在提高网络性能和减少延迟方面起到了关键作用。本文将深入探讨OkHttp中的连接池实现,包括连接对象的添加、移除机制以及其工作原理。 首先,我们需要了解什么是...
Java FTP连接池是一种用于管理FTP(文件传输协议)连接的资源池,它的主要目标是提高应用程序的性能和效率。在传统的FTP操作中,每次需要连接到FTP服务器时都会创建一个新的连接,这会消耗大量时间和系统资源。而...
Tomcat 连接池和阿里 Druid 连接池的配置和比较 Tomcat 连接池是一种基于 Java 的数据库连接池实现,提供了高效、可靠的数据库连接管理。阿里 Druid 连接池是阿里巴巴开发的开源连接池,提供了高性能、可靠的数据库...
在标签中,“MongoDB”是数据库的名字,“Mongo连接池”指的是针对MongoDB数据库的连接池,“连接池”是数据库连接管理的一个通用概念,适用于各种数据库系统。 在压缩包“mongodb_pool”中,可能包含了以下内容: ...
数据库连接池是数据库管理中的重要概念,特别是在高并发和大数据量的应用场景下,它能显著提升性能并降低系统资源消耗。在C#编程环境中,我们可以使用自定义的数据库连接池来实现这一功能。本篇文章将深入探讨“C#...
Java数据库连接池驱动是Java应用程序在访问数据库时用于优化资源管理的一种技术。它提供了一种在多个数据库操作之间重用数据库连接的方式,从而避免了频繁创建和关闭连接带来的性能开销。连接池的核心思想是池化资源...
Tomcat 连接池配置详解 Tomcat 连接池配置是 Web 应用程序中一个非常重要的组件,它负责管理和维护数据库连接,确保数据访问的高速和安全性。本文将详细介绍 Tomcat 连接池配置的步骤和原理,帮助读者快速掌握 ...
本文将深入探讨RabbitMQ客户端连接池的工作原理,并分析其源码,以期帮助读者理解如何有效地利用连接池优化系统性能。 连接池的基本思想是预先创建一定数量的连接并保持空闲状态,当应用需要时可以从池中获取,使用...
数据库连接池是数据库管理中的一个重要概念,它在C#编程中扮演着优化数据库操作的关键角色。C#数据库连接池是一种管理数据库连接的技术,通过复用已存在的连接而不是每次请求时都创建新的连接,从而提高数据库操作的...
在Spring框架中,数据库连接池是管理数据库连接的关键组件,它能有效地提高应用程序的性能和资源利用率。在上述内容中,提到了两种常用的连接池实现:Apache的DBCP(BasicDataSource)和C3P0(ComboPooledDataSource...
在.NET Core 2.1框架下,可以使用.NET Standard库来实现高效、优化的数据库连接管理,特别是通过连接池来提高性能。本文将深入探讨如何在C#中使用MySQL数据库连接池。 首先,我们需要了解什么是数据库连接池。...
对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接的配置,实现数据库连接池技术。某一应用最大可用数据库连接数的限制,避免某一应用独占所有数据库资源。 在较为完备的数据库连接池实现中,可根据...
MySQL数据库连接池是提高应用程序性能的一种重要技术,它允许开发者管理多个数据库连接并高效地复用这些连接,而不是每次需要时都创建新的连接。在C#编程中,我们可以使用自定义的连接池或者第三方库如ADO.NET的...
Socket客户端连接池是一种在分布式系统或网络编程中提高性能和效率的重要技术。它允许应用程序预先创建并维护一组可重用的Socket连接,从而避免了每次通信时建立新连接的开销。本文将深入探讨Socket客户端连接池的...
使用连接池技术时的配置 在本文中,我们将讨论使用连接池技术时的配置,特别是关于 Tomcat、MySQL 和 Eclipse 的数据库连接池配置。 一、开发工具介绍 为了配置连接池,我们需要使用以下开发工具: * Tomcat ...
Java Socket 连接池实现是提高网络应用性能和效率的关键技术之一。在高并发的网络环境中,频繁地创建和销毁Socket连接会导致大量的系统资源浪费,影响整体性能。为了解决这个问题,开发人员通常会使用连接池来管理和...
2. 创建连接池:通过oci池化函数ociPoolCreate创建连接池,指定最小、最大连接数以及空闲连接超时时间。 3. 获取连接:当需要访问数据库时,从连接池中获取一个已建立的连接,而不是每次都新建。 4. 使用连接:执行...