`
wangxiaohigh
  • 浏览: 1426133 次
文章分类
社区版块
存档分类
最新评论

数据库连接池的基本原理

阅读更多
传统的数据库连接方式(指通过DriverManager和基本实现DataSource进行连接)中,一个数据库连接对象均对应一个物理数据库连接,数据库连接的建立以及关闭对系统而言是耗费系统资源的操作,在多层结构的应用程序环境中这种耗费资源的动作对系统的性能影响尤为明显。

  在多层结构的应用程序中通过连接池(connection pooling)技术可以使系统的性能明显得到提到,连接池意味着当应用程序需要调用一个数据库连接的时,数据库相关的接口通过返回一个通过重用数据库连接来代替重新创建一个数据库连接。通过这种方式,应用程序可以减少对数据库连接操作,尤其在多层环境中多个客户端可以通过共享少量的物理数据库连接来满足系统需求。通过连接池技术Java应用程序不仅可以提高系统性能同时也为系统提高了可测量性。

  数据库连接池是运行在后台的而且应用程序的编码没有任何的影响。此中状况存在的前提是应用程序必须通过DataSource对象(一个实现javax.sql.DataSource接口的实例)的方式代替原有通过DriverManager类来获得数据库连接的方式。一个实现javax.sql.DataSource接口的类可以支持也可以不支持数据库连接池,但是两者获得数据库连接的代码基本是相同的。

  代码如下:

  一个DataSource对象通常注册在JNDI命名服务上,应用程序可以通过标准的方式获得到注册在JNDI服务上的DataSource对象。

  Context ctx = new InitialContext();

  DataSource ds = (DataSource) ctx.lookup("jdbc/openbase");

  如果当前DataSource不支持数据库连接池,应用程序将获得一个和物理数据库连接对应的Connection对象。而如果当前的DataSource对象支持数据库连接池,应用程序自动获得重用的数据库连接而不用创建新的数据库连接。重用的数据库连接和新建立连接的数据库连接使用上没有任何不同。应用程序可以通过重用的连接正常的访问数据库,进行访问数据的操作,完成操作后应显式的调用close()关闭数据库连接。

  Connection con = ds.getConnection("User", "Pwd");

  相关数据库的操作;

  con.close();

  当关闭数据连接后,当前使用的数据库连接将不会被物理关闭,而是放回到数据库连接池中进行重用。

  JDBC3.0规范中数据库连接池框架

  JDBC3.0规范中通过提供了一个支持数据库连接池的框架,这个框架仅仅规定了如何支持连接池的实现,而连接池的具体实现JDBC 3.0规范并没有做相关的规定。通过这个框架可以让不同角色的开发人员共同实现数据库连接池。

  通过JDBC3.0规范可以知道具体数据库连接池的实现可以分为JDBC Driver级和Application Server级。在JDBC Driver级的实现中任何相关的工作均由特定数据库厂商的JDBC Drvier的开发人员来具体实现,即JDBC Driver既需要提供对数据库连接池的支持同时也必须对数据库连接池进行具体实现。而在Application Server级中数据库连接池的实现中特定数据库厂商的JDBC Driver开发人员和Application Server开发人员来共同实现数据库连接池的实现(但是现在大多数Application Server厂商实现的连接池的机制和规范中提到有差异),其中特定数据库厂商的JDBC Driver提供数据库连接池的支持而特定的Application Server厂商提供数据库连接池的具体实现。

  JDBC3.0规范规定了如下的类和接口来支持数据库连接池的实现。

  javax.sql.ConnectionEvent

  javax.sql.ConnectionPoolDataSource

  javax.sql.PooledConnection

  javax.sql.ConnectionEventListener

  其中除javax.sql.ConnectionEvent是类,其它的均为接口。

  通过此图可以大概的了解相关接口在一个典型的三层环境中应用程序的位置。

  数据库连接池实现层次中,由特定数据库厂商的JDBC Driver开发人员提供连接池支持,而特定Application Server提供连接池实现的情况比较复杂,其它的实现层次均可视为其简化情况的一种。下面将针对这种情况进行说明。

  在这个框架主要有两个用户角色存在,它们分别是:

  特定数据库厂商的JDBC Driver开发人员,之后将简称为Driver Vendor

  特定Application Server中连接池开发人员,之后将简称为Pooling Vendor

  下面对几个关键模块进行详细的说明:

  Driver Vendor DataSource:

  Driver Vendor必须提供一个ConnectionPoolDataSource 接口的具体实现,通过这个接口Pooling Vendor可以得到一个PooledConnection对象,从而使第三方实现的连接池可以使用特定数据库厂商得到JDBC Driver产生的数据库连接。在这里ConnectionPoolDataSource接口扮演的角色可以视为产生PooledConnection 对象的工厂。

  Driver Vendor PooledConnection:

  Driver Vendor必须提供标准PooledConnection 接口实现的类,这个接口允许Pooling Vendor在JDBC Driver提供连接池支持的基础上实现连接池。一个具体PooledConnection对象代表了一个物理的数据库连接;由PooledConnection对象创建Connection对象仅仅只是一个指向PooledConnetion对象的句柄。在JDBC 3.0连接池实现框架中PooledConnection对象扮演的角色可以视为产生Connection对象的工厂。

  Pooling Vendor DataSource:

  Pooling Vendor必须实现DataSource接口,这个接口是和连接池实现模块进行交互的入口点。ConnectionPoolDataSource根据需要创建PooledConnection对象。

  Pooling Vendor Connection Cache:

  此模块是Pooling Vendor对连接池的具体实现。JDBC 3.0 规范没有规定在DataSource对象和数据库连接池实现之间的需要实现的接口,所以它们之间的交互由Pooling Vendor自己定义。一般而言,一个数据库连接池的具体实现包含了一个或若干个具体的类,但是在连接池实现模块中必须包含一个类实现标准ConnectionEventListener接口。当一个PooledConnectiond对象被关闭或者出现异常的时候,PooledConnection对象将会向ConnectionEventListener接口发送ConnectionEvent对象,连接池实现模块将会根据返回的ConnectionEvent对象对PooledConnection进行关闭或者重用操作。

  ConnectionEvent:

  实现连接池时,当应用程序调用Connection.close()试图去关闭数据库连接时,这时需要有一个通告给连接池实现模块,通告对当前的数据库物理连接(PooledConnection 对象)进行重用。为了使连接池实现模块能得到这种"通告",连接池实现模块必须实现ConnectionEventListener接口,而且同时需要注册成为PooledConnection对象的监听者。连接池实现模块通过PooledConnection.addConnectionEventListener()方法注册自己成为一个监听者。

  在典型三层环境中具体调用流程:

  当应用程序通过调用DataSource.getConnection()得到一个数据库连接。

  Pooling Vendor实现的DataSource对象在连接池中进行查找看当前是否有有效的PooledConnection对象,如果连接池中有可用的PooledConnection,则进行检查,如果当前的PooledConnection可用则使用。

  如果如果连接池中没有可用的PooledConnection对象,或者当前的PooledConnection对象不正确,那么Pooling Vendor调用ConnectionPoolDataSource.getPooledConnection类创建一个新的PooledConnection对象,这时由Driver Vendor实现的ConnectionPoolDataSource将会创建一个满足要求新的PooledConnection对象,并将其返回给连接池实现模块进行管理。

  然后,Pooling Vendor会调用PooledConnection.getConnection()获得一个逻辑的Connection对象,这个逻辑的Connection对象将会象正常的Connection对象返回给应用程序。这个逻辑Connection对象实际上是连接池中PooledConnection对象的一个句柄,当连接池有效时,应用程序调用DataSource.getConnection()就会得到这个句柄。简而言之,应用程序此时使用的Connection对象仅仅是其创建者PooledConnection对象的句柄而已。

  连接池实现模块调用PooledConnection.addConnectionEventListener()将自己注册成为一个PooledConnection对象的监听者,当数据库连接需要重用或者关闭的时候连接池实现模块可以得到通告。

  当应用程序通过调用Connection.close()来关闭数据库连接,这时一个ConnectionEvent对象被创建并被返回到连接池实现模块,连接池实现模块接受到此通告后,将PooledConnection对象返回到池中进行重用。这些过程中其它角色都不能访问PooledConnection.close()方法,能访问这个方法的只有Pooling Vendor,它们使用这个方法对连接池中的对象进行操作,通过PooledConnection.close()方法可以关闭物理数据库连接。

分享到:
评论

相关推荐

    数据库的连接池原理,基本概念及原理,服务器自带的连接池

    数据库的连接池原理的讲解 基本概念及原理 服务器自带的连接池 并发问题 多数据库服务器和多用户 事务处理 连接池的分配与释放 连接池的配置与维护

    数据库连接池的图解原理

    数据库连接池的图解原理 一般情况下,在使用开发基于数据库的WEB程序时,传统的模式基本是按以下步骤: 1. 在主程序(如Servlet、Beans)中建立数据库连接。 2. 进行SQL操作,取出数据。 3. 断开数据库连接。...

    java数据库连接池

    数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接, 当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。 我们可以通过设定连接池最大连接数...

    数据库连接池原理

    数据库 连接池 原理 ...数据库连接池技术是解决这个问题最常用的方法,在许多应用程序服务器(例如:Weblogic,WebSphere,JBoss)中,基本都提供了这项技术,无需自己编程,但是,深入了解这项技术是非常必要的。

    C3P0数据库连接池驱动.zip

    数据库连接池的基本原理就是为数据库建立一个缓冲池。在缓冲池中先创建指定数量的数据库连接,当有连接请求时就从缓冲池中取出处于“空闲”状态的连接,并将此连接标记为“忙碌”,直到该请求进程结束后,它所使用的...

    基于JAVA JSP数据库连接池的研究与实现的毕业设计,使用数据库连接池方式能对数据库的连接进行管理和维护,上层应用程序通过数据

    文章通过介绍、分析数据库连接池工作的基本原理,了解目前流行的WEB服务器在数据库连接池方面的使用现状后,总结了一些数据库连接池开发程序中容易忽略的问题。并在学习掌握了实现连接池的关键技术后给出了一个较为...

    基于Java数据库连接池的研究与创新

    面向对象软件设计是当今软件设计模式的潮流,而基于面向对象软件设计方法的数据库连接池是其中的一个重要的研究课题。本文首先介绍了传统连接、tomcat下连接池和hibernate下连接池的基本原理,然后在此基础上提出了...

    一种基于JSP数据库连接池的研究与实现(含jsp源码和文章说明和数据库).rar

    文章通过介绍、分析数据库连接池工作的基本原理,了解目前流行的WEB服务器在数据库连接池方面的使用现状后,总结了一些数据库连接池开发程序中容易忽略的问题。并在学习掌握了实现连接池的关键技术后给出了一个较为...

    Java-jdbc数据库连接池总结.doc

    Java应用程序访问数据库的基本原理  在Java语言中,JDBC(Java DataBase Connection)是应用程序与数据库沟通的桥梁,  即Java语言通过JDBC技术访问数据库。JDBC是一种“开放”的方案,它为数据库应用开发人员﹑...

    Java建立数据库连接池

    对于一个简单的数据库引用,用于对数据库的访问不是很频繁。这时可以简单的在需要访问数据库是,创建一个连接,用完后关闭它,这样...  数据库连接池的基本原理是在内部对象池中维护一定数量的数据库连接,并对外暴露

    数据源与连接池

    . 连接池基本的思想,原理 数据库连接池技术的优点: c3p0的使用

    JDBC数据库编程实验

    一、实验目的: ...(5)理解数据库连接池的基本原理和思想,学会在tomcat服务器中配置数据库连接池,并掌握从连接池中获取连接的基本方法。 (6)初步理解数据访问层的基本设计方法,理解web的分层架构。

    Tomcat 7-dbcp配置数据库连接池详解

    Tomcat 7-dbcp配置数据库连接池详解 原理  关于连接池,大家都晓得用来限定对数据库的连接。基本的原理是预先在缓冲池中放入一定的空闲连接,当程序需要和数据库来交互时,不是直接新建数据库连接而是在连接池中...

    JSP软件开发中数据库连接池技术的探讨与应用 (2007年)

    结合传统情况在开发基于数据库的Web应用时,对后台数据库的访问模式...描述了数据库连接池的基本概念、工作原理,分析了关键问题,并且以tomcat服务器上实现MySQL数据库连接池和编写数据库连接池类为例,实现连接池的应用。

    基于JDBC的数据库连接池技术研究与应用

    近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用。  基于B/S(Browser/Server)架构的3层开发...Java应用程序访问数据库的基本原理  

    完整版Java web开发教程PPT课件 Java开发进阶教程 第20章 数据库连接池,缓存(共15页).pptx

    完整版Java web开发教程PPT课件 Java开发进阶教程 第20章 数据库连接池,缓存(共15页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第22章 常用框架的介绍以及环境搭建(共16页).pptx JS课程案例...

    数据库连接池技术及其在Weblogic Server中的配置 (2006年)

    在分析直接通过JDBC连接数据库这种连接方式的基础上,指出了传统数据库连接技术中存在的运行效率低、软件移植性和...主要介绍数据库连接池的基本原理和工作机制,并给出了在Weblogic Server中数据库连接池的配置实例。

    EDA/PLD中的基于JDBC的数据库连接池技术研究与应用

    近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用。  基于B/S(Browser/Server)架构的3层开发...Java应用程序访问数据库的基本原理  

    高级数据库

    此ppt中包含了数据库连接池的基本概念、原理以及使用方法;存储过程的基本概念和语法以及使用方法,MySql和Sql Server数据库存储过程的区别;触发器的基本概念、语法、使用以及MySql与Sql Server数据库的区别;ORM...

Global site tag (gtag.js) - Google Analytics