`
wbj0110
  • 浏览: 1613082 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

JDBC的数据库连接池的工作原理

阅读更多

随着信息技术的高速发展与广泛应用,数据库技术在信息技术领域中的位置越来越重要,尤其是网络应用和电子商务的迅速发展,都需要数据库技术支持动态Web站点的运行,而传统的开发模式是:首先在主程序(如Servlet、Beans)中建立数据库连接;然后进行SQL操作,对数据库中的对象进行查询、修改和删除等操作;最后断开数据库连接。使用这种开发模式,对于一个简单的数据库应用,由于数据库的访问不是很频繁,只需要在访问数据库时创建一个连接,用完后就关闭它,这样做不会明显的增大系统的开销。但是对于一个复杂的数据库应用,情况就完全不同:频繁的建立、关闭数据库,会极大的降低系统的性能,增大系统的开销,甚至成为系统的瓶颈。另外使用这种传统的模式,还必须管理数据库的每一个连接,以确保他们能正确关闭,如果出现程序异常而导致某些连接未能关闭,将引起数据库系统中的内存泄露,最终不得不重启数据库。因此采用运行速度更快、数据库访问效率更高的数据库技术,以提高系统的运行效率将是至关重要的。 

  为了解决这一问题,在JDBC2.0中提出了JDBC连接池技术,通过在客户之间共享一组连接,而不是在它们需要的时候再为它们生成,这样就可以改善资源使用,提高应用程序的响应能力。 

  JDBC 概述 

  JDBC(Java Database Connectivity,Java数据库连接)是一种用于执行SQL语句的JavaAPI,可以为多种关系型数据库(如Oracle、Sybase、SQL Server、Access等)提供统一访问接口,它由一组Java语言编写的类和接口组成,使数据库开发人员能够用标准JavaAPI编写数据库应用程序。 

  连接池技术 

  1、连接池原理 

  连接池技术的核心思想是:连接复用,通过建立一个数据库连接池以及一套连接使用、分配、管理策略,使得该连接池中的连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。另外,由于对JDBC中的原始连接进行了封装,从而方便了数据库应用对于连接的使用(特别是对于事务处理),提高了开发效率,也正是因为这个封装层的存在,隔离了应用的本身的处理逻辑和具体数据库访问逻辑,使应用本身的复用成为可能。连接池主要由三部分组成:连接池的建立、连接池中连接的使用管理、连接池的关闭。下面就着重讨论这三部分及连接池的配置问题。 

  1.1 连接池的建立 

  应用程序中建立的连接池其实是一个静态的。所谓静态连接池是指连接池中的连接在系统初始化时就已分配好,且不能随意关闭连接。Java中提供了很多容器类可以方便的构建连接池,如:Vector、Stack、Servlet、Bean等,通过读取连接属性文件Connections.properties与数据库实例建立连接。在系统初始化时,根据相应的配置创建连接并放置在连接池中,以便需要使用时能从连接池中获取,这样就可以避免连接随意的建立、关闭造成的开销。 

  1.2 连接池的管理 

  连接池管理策略是连接池机制的核心。当连接池建立后,如何对连接池中的连接进行管理,解决好连接池内连接的分配和释放,对系统的性能有很大的影响。连接的合理分配、释放可提高连接的复用,降低了系统建立新连接的开销,同时也加速了用户的访问速度。下面介绍连接池中连接的分配、释放策略。 

  连接池的分配、释放策略对于有效复用连接非常重要,我们采用的方法是一个很有名的设计模式:Reference Counting(引用记数)。该模式在复用资源方面应用的非常广泛,把该方法运用到对于连接的分配释放上,为每一个数据库连接,保留一个引用记数,用来记录该连接的使用者的个数。具体的实现方法是: 

  当客户请求数据库连接时,首先查看连接池中是否有空闲连接(指当前没有分配出去的连接)。如果存在空闲连接,则把连接分配给客户并作相应处理(即标记该连接为正在使用,引用计数加1)。如果没有空闲连接,则查看当前所开的连接数是不是已经达到maxConn(最大连接数),如果没达到就重新创建一个连接给请求的客户;如果达到就按设定的maxWaitTime(最大等待时间)进行等待,如果等待maxWaitTime后仍没有空闲连接,就抛出无空闲连接的异常给用户。 

  当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就删除该连接,并判断当前连接池内总的连接数是否小于minConn(最小连接数),若小于就将连接池充满;如果没超过就将该连接标记为开放状态,可供再次复用。可以看出正是这套策略保证了数据库连接的有效复用,避免频繁地建立、释放连接所带来的系统资源开销。 

  1.3 连接池的关闭 

  当应用程序退出时,应关闭连接池,此时应把在连接池建立时向数据库申请的连接对象统一归还给数据库(即关闭所有数据库连接),这与连接池的建立正好是一个相反过程。 

  1.4 连接池的配置 

  数据库连接池中到底要放置多少个连接,才能使系统的性能更佳,用minConn和maxConn来限制。minConn是当应用启动的时候连接池所创建的连接数,如果过大启动将变慢,但是启动后响应更快;如果过小启动加快,但是最初使用的用户将因为连接池中没有足够的连接不可避免的延缓了执行速度。因此应该在开发的过程中设定较小minConn,而在实际应用的中设定较大minConn。maxConn是连接池中的最大连接数,可以通过反复试验来确定此饱和点。为此在连接池类ConnectionPool中加入两个方法getActiveSize()和getOpenSize(),ActiveSize 表示某一时间有多少连接正被使用,OpenSize表示连接池中有多少连接被打开,反映了连接池使用的峰值。将这两个值在日志信息中反应出来, minConn的值应该小于平均ActiveSize,而maxConn的值应该在activeSize和OpenSize之间。 

  2、连接池的关键技术 

  2.1 事务处理 

  前面讨论的是关于使用数据库连接进行普通的数据库访问。对于事务处理,情况就变得比较复杂。因为事务本身要求原则性的保证,此时就要求对于数据库的操作符合"All-All-Nothing"原则,即要么全部完成,要么什么都不做。如果简单的采用上述的连接复用的策略,就会发生问题,因为没有办法控制属于同一个事务的多个数据库操作方法的动作,可能这些数据库操作是在多个连接上进行的,并且这些连接可能被其他非事务方法复用。Connection本身具有提供了对于事务的支持,可以通过设置Connection的AutoCommit属性为false,显式的调用 commit或rollback方法来实现。但是要安全、高效的进行连接复用,就必须提供相应的事务支持机制。方法是:采用显式的事务支撑方法,每一个事务独占一个连接。这种方法可以大大降低对于事务处理的复杂性,并且又不会妨碍连接的复用。 

  连接管理服务提供了显式的事务开始、结束(commit或rollback)声明,以及一个事务注册表,用于登记事务发起者和事务使用的连接的对应关系,通过该表,使用事务的部分和连接管理部分就隔离开,因为该表是在运行时根据实际的调用情况动态生成的。事务使用的连接在该事务运行中不能被复用。在实现中,用户标识是通过使用者所在的线程来标识的。后面的所有对于数据库的访问都是通过查找该注册表,使用已经分配的连接来完成的。当事务结束时,从注册表中删除相应表项。 

  2.2 封装 

  从上面的论述可以看出,普通的数据库方法和事务方法对于连接的使用(分配、释放)是不同的,为了便于使用,对外提供一致的操作接口,我们对连接进行了封装:普通连接和事务连接,并利用了Java中的强大的面向对象特性:多态。普通连接和事务连接均实现了一个DbConnection接口,对于接口中定义的方法,分别根据自己的特点作了不同的实现,这样在对于连接的处理上就非常的一致了。 

  2.3 并发 

  为了使连接管理服务有更大的通用性,我们必须要考虑到多线程环境,即并发问题。在一个多线程的环境下,必须要保证连接管理自身数据的一致性和连接内部数据的一致性,在这方面Java提供很好的支持(synchronized关键字),这样就很容易使连接管理成为线程安全的。 

  2.4 多数据库服务器 

  在实际应用中,应用程序常常需要访问多个不同的数据库。如何通过同一个连接池访问不同的数据库,是应用程序需要解决的一个核心问题。下面介绍一种解决的途径: 

  首先,定义一个数据库连接池参数的类,定义了数据库的JDBC驱动程序类名,连接的URL以及用户名口令等等一些信息,该类是用于初始化连接池的参数: 



public class ConnectionParam implements Serializable{ 
 //各初始化参数的定义 

  其次是连接池的工厂类ConnectionFactory,通过该类将一个连接池对象与一个名称对应起来,使用者通过该名称就可以获取指定的连接池对象,实现的主要代码如下: 

public class ConnectionFactory{ 
 static Hashtable connectionPools = //用来保存数据源名和连接池对象的关系 
 public static DataSource lookup(String dataSourceName) throws 
 NameNotFoundException{ 
  //查找名字为dataSourceName的数据源 
 } 

 public static DataSource bind(String name, ConnectionParam param) 
 throws Exception 
 //将名字name与使用param初始化的连接池对象绑定 


public static void unbind(String name) throws NameNotFound 
Exception{ 
 //将与名字name绑定的连接池对象删除 

  连接池应用的实现 

  一个完整的连接池应用包括三个部分:DBConnectionPool类,负责从连接池获取(或创建)连接、将连接返回给连接池、系统关闭时关闭所有连接释放所有资源;DBConnectionManager类,负责装载和注册JDBC驱动、根据属性文件中定义的属性创建DBConnectionPool、跟踪应用程序对连接池的引用等;应用程序对连接池的使用。 

  本文实现的数据库连接池包括一个管理类DBConnectionManager,负责提供与多个连接池对象(DBConnectionPool类)之间的接口。每一个连接池对象管理一组封装过的JDBC连接对象Conn,封装过的JDBC连接对象Conn可以被任意数量的Model层的组件共享。 

  类Conn 的设计很简单,如下所示: 

Class Conn { 
 Private java. sgl .Connection con; //数据库连接对象 
 Public Boolean inUse ; //是否被使用 
 Public long lastAccess; //最近一次释放该连接的时间 
 Public int useCount; // 被使用次数 

  下面是实现连接池的主要代码: 

// 初始化数据库连接池 

public static synchronized void FastInitPool() 
throws Exception { 
 try { Class.forName(driver); 
  for (int i=0; i<size; i++) { 
   Connection con = createConnection(); 
   if (con!=null) addConnection(con); 
  } } } 

// 向连接池对象中添加数据库连接 

private static void addConnection(Connection con) { 
 if (pool=null||pool1=null) { 
  pool=new Vector(size); 
  pool1=new Vector(size); } 
 pool.addElement(con); 
 pool1.addElement("false"); } 

// 获取数据库连接 

public static synchronized Connection getConn() 
throws Exception { 
 Connection conn = null; 
 tr 
 FastInitPool(); 
  // 获得一个可用的(空闲的)连接 
 .for (int i = 0; i < pool.size(); i++) { 
  conn = (Connection)pool.elementAt(i); 
  if (pool1.elementAt(i)=="false") { 
   pool1.set(i,"true"); 
   //System.out.println("从连接池中获取第"+(i+1)+"个空闲连接"); 
   return conn; 
  } 
 } 
 //如果没有可用连接,且已有连接数小于最大连接数限制,则创建并增加一个新连接到连接池 
 conn = createConnection(); 
 pool.addElement(conn); 
 pool1.addElement("true"); 
 // System.out.println(" 所有连接都在使用,在连接池中再创建一个新连接"); 


catch (Exception e) { 
 System.err.println(e.getMessage()); 
 throw new Exception(e.getMessage()); 

return conn; //返回一个有效的新连接 


public Connection getConnection(String strDriver, String strUrl, String strUserName, String strPassWord) 
throws SQLException{ 
 try{ Class.forName(strDriver); 
  conn = DriverManager.getConnection(strUrl, strUserName, strPassWord); } 
 return conn; } 
  结束语 

  当前Web应用程序广泛采用B/S结构,其并发性决定了多用户同时访问数据库的问题。本文阐述的基于JDBC的数据库连接池技术已成功应用于基于Web的高职教学系统开发中,并建立了数据库连接池实例来说明和证实连接池的访问方法。只有充分运用连接池访问技术,才能提高数据库的访问效率,改善Web应用,从而减少系统开销,大大提高整个Web应用系统的运行效率。

http://zorro.blog.51cto.com/2139862/940281

分享到:
评论

相关推荐

    Java jdbc数据库连接池总结

    数据库连接池(connection pool)的工作原理是为了解决资源的频繁分配、释放所造成的问题。数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时...

    JDBC数据库连接池实现原理

    通过以上步骤,你可以全面了解JDBC数据库连接池的实现原理,以及如何在实际项目中有效地使用和配置它。在实践中,结合Oracle数据库的特性和JDBC API,可以更好地优化数据库操作,提升系统的稳定性和效率。

    java_jdbc数据库连接池总结

    Java JDBC 数据库连接池是 Java 应用程序访问数据库的基本原理之一。Java 语言通过 JDBC 技术访问数据库,JDBC 是一种“开放”的方案,为数据库应用开发人员和数据库前台工具开发人员提供了一种标准的应用程序设计...

    jdbc数据库连接池工程文件

    2. **数据库连接池原理**:连接池管理数据库连接的创建、分配、回收和销毁。通过预创建并维护一定数量的连接,避免了每次请求时创建新连接的开销,同时通过连接复用,降低了数据库资源的消耗。 3. **常见数据库连接...

    jdbc数据库连接池

    ** JDBC数据库连接池详解 ** 在Java开发中,JDBC(Java Database Connectivity)是用于与数据库交互的标准API。然而,直接使用JDBC进行数据库操作可能会导致资源管理的问题,因为每次数据库连接的创建和关闭都会...

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

    Java JDBC数据库连接池是Java应用程序与数据库交互的重要优化手段,旨在提高数据库访问效率和资源利用率。在传统的JDBC操作中,每次请求都需要建立和关闭数据库连接,这不仅耗时,还可能导致系统资源的过度消耗,...

    最新版加注释通用JDBC数据库连接池

    本资源名为“最新版加注释通用JDBC数据库连接池”,显然它提供了一个带有详细注释的通用JDBC数据库连接池实现,这将有助于开发者理解和使用。这里我们将详细讲解数据库连接池的概念、工作原理以及如何使用。 **...

    JDBC数据库连接池总结.doc

    JDBC数据库连接池总结 一、JDBC数据库连接池概述 在基于B/S架构的三层开发模式中,Java应用程序访问数据库的基本原理是通过JDBC(Java DataBase Connection)技术。JDBC是一种“开放”的方案,为数据库应用开发...

    Java_jdbc数据库连接池总结

    Java JDBC数据库连接池总结 Java JDBC(Java Database Connectivity)是Java语言访问数据库的标准接口,它允许应用程序通过编写Java代码来与各种数据库进行交互。在Web应用程序中,由于B/S架构的普及,Java JDBC...

    Java jdbc数据库连接池总结2

    本篇文章将深入探讨Java JDBC数据库连接池的工作原理及其重要性。 ### 数据库连接池的工作原理 1. **初始化**: 应用程序启动时,连接池会预先创建一定数量的数据库连接并保存在池中。这些连接被称为“空闲连接”。...

    一种简单JDBC数据库连接池的实现.rar_connection pool jdbc_site:www.pudn.com_数据库

    实现一个简单的JDBC数据库连接池,我们通常需要以下组件: 1. 连接池初始化:配置连接池的大小,预创建指定数量的数据库连接,并将它们存入池中。 2. 获取连接:提供一个方法供应用获取数据库连接,当连接池中有...

    一种简单JDBC数据库连接池的实现

    通过这个简单的JDBC数据库连接池实现,我们可以学习到数据库连接池的基本原理和操作方式。然而,在实际生产环境中,我们通常会使用成熟的连接池实现,如Apache的DBCP、C3P0或HikariCP,它们提供了更高级的功能和更好...

    JDBC数据库连接池总结.pdf

    【JDBC数据库连接池总结】 在Java开发中,JDBC(Java Database Connectivity)是用于连接应用程序和数据库的关键技术。JDBC提供了一套API,使得开发者能够以标准的方式编写数据库交互代码。然而,直接使用JDBC在高...

    数据库连接池的工作原理

    数据库连接池的工作原理涉及到多个层面,包括连接的创建与复用、连接池的管理以及性能优化策略。接下来,我们将深入探讨这些核心知识点。 1. **连接的创建与复用** - **连接初始化**:当应用程序启动时,连接池会...

    Java_jdbc数据库连接池总结.doc

    #### 四、数据库连接池的概念与工作原理 为了解决上述问题,引入了数据库连接池技术。连接池的核心思想是在应用程序启动时预创建一定数量的数据库连接,并将其存储在一个池中。当需要访问数据库时,应用程序可以...

    数据库连接池的原理机制学习

    ### 数据库连接池的原理机制深入解析 #### 一、基本概念及原理 数据库连接池是一种用于管理和重用数据库连接的技术。它通过预创建并维护一定数量的数据库连接,使得应用程序能够快速获取并释放这些连接,从而提高...

    Java中数据库连接池原理机制的详细讲解.pdf

    ### Java中数据库连接池原理机制详解 #### 一、引言 在现代软件开发中,尤其是在基于Java的应用程序中,数据库连接池技术是一项至关重要的技术。它能够显著提高应用程序访问数据库的效率,减少资源消耗,并简化...

    JDBC数据库编程实验

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

Global site tag (gtag.js) - Google Analytics