`
FengShen_Xia
  • 浏览: 279401 次
  • 性别: Icon_minigender_1
  • 来自: 东方水城
社区版块
存档分类
最新评论

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

    博客分类:
  • JDBC
阅读更多

1.前言
  数据库应用,在许多软件系统中经常用到,是开发中大型系统不可缺少的辅助。但如果对数据库资源没有很好地管理(如:没有及时回收数据库的游标(ResultSet)、Statement、连接 (Connection)等资源),往往会直接导致系统的稳定。这类不稳定因素,不单单由数据库或者系统本身一方引起,只有系统正式使用后,随着流量、用户的增加,才会逐步显露。
  在基于Java开发的系统中,JDBC是程序员和数据库打交道的主要途径,提供了完备的数据库操作方法接口。但考虑到规范的适用性,JDBC只提供了最直接的数据库操作规范,对数据库资源管理,如:对物理连接的管理及缓冲,期望第三方应用服务器 (Application Server)的提供。
  本文,以JDBC规范为基础,介绍相关的数据库连接池机制,并就如果以简单的方式,实现有效地管理数据库资源介绍相关实现技术。

  2.连接池技术背景
  2.1 JDBC
  JDBC是一个规范,遵循JDBC接口规范,各个数据库厂家各自实现自己的驱动程序(Driver),如下图所示:

 应用在获取数据库连接时,需要以URL的方式指定是那种类型的Driver,在获得特定的连接后,可按照固定的接口操作不同类型的数据库,如: 分别获取Statement、执行SQL获得ResultSet等,如下面的例子 :

      import java.sql.*;
  …
  DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
  Connection dbConn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:oracle","username","password");
  Statement st = dbConn.createStatement();
  ResultSet rs = st.executeQuery("select * from demo_table");

  …some data source operation in here

  rs.close();
  st.close();
  dbConn.close();
 


  在完成数据操作后,还一定要关闭所有涉及到的数据库资源。这虽然对应用程序的逻辑没有任何影响,但是关键的操作。上面是个简单的例子,如果搀和众多的if-else、exception,资源的管理也难免百密一疏。如同C中的内存泄漏问题,Java系统也同样会面临崩溃的恶运。所以数据库资源的管理依赖于应用系统本身,是不安全、不稳定的一种隐患。

  2.2 JDBC连接池
  在标准JDBC对应用的接口中,并没有提供资源的管理方法。所以,缺省的资源管理由应用自己负责。虽然在 JDBC规范中,多次提及资源的关闭/回收及其他的合理运用。但最稳妥的方式,还是为应用提供有效的管理手段。所以,JDBC为第三方应用服务器(Application Server)提供了一个由数据库厂家实现的管理标准接口:连接缓冲(connection pooling)。引入了连接池( Connection Pool )的概念 ,也就是以缓冲池的机制管理数据库的资源。

  JDBC最常用的资源有三类:
  — Connection: 数据库连接。
  — Statement: 会话声明。
  — ResultSet: 结果集游标。

  分别存在以下的关系 :

  这是一种“爷—父—子”的关系,对Connection的管理,就是对数据库资源的管理。举个例子: 如果想确定某个数据库连接(Connection)是否超时,则需要确定其(所有的)子Statement是否超时,同样,需要确定所有相关的 ResultSet是否超时;在关闭Connection前,需要关闭所有相关的Statement和ResultSet。
  因此,连接池(Connection Pool)所起到的作用,不仅仅简单地管理Connection,还涉及到 Statement和ResultSet。

  2.3 连接池(ConnectionPool)与资源管理
  ConnectionPool以缓冲池的机制,在一定数量上限范围内,控制管理Connection,Statement和ResultSet。任何数据库的资源是有限的,如果被耗尽,则无法获得更多的数据服务。
  在大多数情况下,资源的耗尽不是由于应用的正常负载过高,而是程序原因。
  在实际工作中,数据资源往往是瓶颈资源,不同的应用都会访问同一数据源。其中某个应用耗尽了数据库资源后,意味其他的应用也无法正常运行。因此,ConnectionPool的第一个任务是限制:每个应用或系统可以拥有的最大资源。也就是确定连接池的大小(PoolSize)。
   ConnectionPool的第二个任务:在连接池的大小(PoolSize)范围内,最大限度地使用资源,缩短数据库访问的使用周期。许多数据库中,连接(Connection)并不是资源的最小单元,控制Statement资源比Connection更重要。以Oracle为例:
  每申请一个连接(Connection)会在物理网络(如 TCP/IP网络)上建立一个用于通讯的连接,在此连接上还可以申请一定数量的Statement。同一连接可提供的活跃Statement数量可以达到几百。在节约网络资源的同时,缩短了每次会话周期(物理连接的建立是个费时的操作)。但在一般的应用中,多数按照2.1范例操作,这样有10个程序调用,则会产生10次物理连接,每个Statement单独占用一个物理连接,这是极大的资源浪费。 ConnectionPool可以解决这个问题,让几十、几百个Statement只占用同一个物理连接, 发挥数据库原有的优点。
  通过ConnectionPool对资源的有效管理,应用可以获得的Statement总数到达 :

  (并发物理连接数)×(每个连接可提供的Statement数量)

  例如某种数据库可同时建立的物理连接数为 200个,每个连接可同时提供250个Statement,那么ConnectionPool最终为应用提供的并发Statement总数为: 200 × 250 = 50,000个。这是个并发数字,很少有系统会突破这个量级。所以在本节的开始,指出资源的耗尽与应用程序直接管理有关。
  对资源的优化管理,很大程度上依靠数据库自身的JDBC Driver是否具备。有些数据库的JDBC Driver并不支持Connection与Statement之间的逻辑连接功能,如SQLServer,我们只能等待她自身的更新版本了。
  对资源的申请、释放、回收、共享和同步,这些管理是复杂精密的。所以,ConnectionPool另一个功能就是,封装这些操作,为应用提供简单的,甚至是不改变应用风格的调用接口。

  3.简单JDBC连接池的实现
  根据第二章中原理机制,Snap-ConnectionPool(一种简单快速的连接池工具,可在www.snapbug.net下载)按照部分的JDBC规范,实现了连接池所具备的对数据库资源有效管理功能。
  3.1 体系描述
  在JDBC规范中,应用通过驱动接口(Driver Interface)直接方法数据库的资源。为了有效、合理地管理资源,在应用与JDBC Driver之间,增加了连接池: Snap-ConnectionPool。并且通过面向对象的机制,使连接池的大部分操作是透明的。参见下图,Snap-ConnectionPool的体系:

  图中所示,通过实现JDBC的部分资源对象接口( Connection, Statement, ResultSet ),在 Snap-ConnectionPool内部分别产生三种逻辑资源对象: PooledConnection, PooledStatement和 PooledResultSet。它们也是连接池主要的管理操作对象,并且继承了JDBC中相应的从属关系。这样的体系有以下几个特点:
  — 透明性。在不改变应用原有的使用JDBC驱动接口的前提下,提供资源管理的服务。应用系统,如同原有的 JDBC,使用连接池提供的逻辑对象资源。简化了应用程序的连接池改造。
  — 资源封装。复杂的资源管理被封装在  Snap-ConnectionPool内部,不需要应用系统过多的干涉。管理操作的可靠性、安全性由连接池保证。应用的干涉(如:主动关闭资源),只起到优化系统性能的作用,遗漏操作不会带来负面影响。
  — 资源合理应用。按照JDBC中资源的从属关系,Snap-ConnectionPool不仅对Connection进行缓冲处理,对Statement也有相应的机制处理。在2.3已描述,合理运用Connection和Statement之间的关系,可以更大限度地使用资源。所以,Snap- ConnectionPool封装了Connection资源,通过内部管理PooledConnection,为应用系统提供更多的Statement 资源。
  — 资源连锁管理。Snap-ConnectionPool包含的三种逻辑对象,继承了JDBC中相应对象之间的从属关系。在内部管理中,也依照从属关系进行连锁管理。例如:判断一个Connection是否超时,需要根据所包含的Statement是否活跃;判断Statement也要根据 ResultSet的活跃程度。

  3.2 连接池集中管理ConnectionManager
  ConnectionPool是Snap- ConnectionPool的连接池对象。在Snap-ConnectionPool内部,可以指定多个不同的连接池(ConnectionPool) 为应用服务。ConnectionManager管理所有的连接池,每个连接池以不同的名称区别。通过配置文件适应不同的数据库种类。如下图所示:



  通过ConnectionManager,可以同时管理多个不同的连接池,提供通一的管理界面。在应用系统中通过 ConnectionManager和相关的配置文件,可以将凌乱散落在各自应用程序中的数据库配置信息(包括:数据库名、用户、密码等信息),集中在一个文件中。便于系统的维护工作。

  3.3 连接池使用范例

  对2.1的标准JDBC的使用范例,改为使用连接池,结果如下:

import java.sql.*;
import net.snapbug.util.dbtool.*;
…
..ConnectionPool dbConn = ConnectionManager
.getConnectionPool("testOracle" );
Statement st = dbConn.createStatement();
ResultSet rs = st.executeQuery(
“select * from demo_table” );
…
some data source operation
in herers.close();st.close();
 



  在例子中,Snap-ConnectionPool封装了应用对Connection的管理。只要改变JDBC获取Connection的方法,为获取连接池(ConnectionPool)(粗体部分),其他的数据操作都可以不做修改。按照这样的方式,Snap- ConnectionPool可帮助应用有效地管理数据库资源。如果应用忽视了最后资源的释放: rs.close() 和 st.close(),连接池会通过超时(time-out)机制,自动回收。

  4.小结

  无论是Snap-ConnectionPool还是其他的数据库连接池,都应当具备一下基本功能:

  -对源数据库资源的保护

  -充分利用发挥数据库的有效资源

  -简化应用的数据库接口,封闭资源管理。

  -对应用遗留资源的自动回收和整理,提高资源的再次利用率。

  在这个前提下,应用程序才能投入更多的精力于各自的业务逻辑中。数据库资源也不再成为系统的瓶颈。

分享到:
评论

相关推荐

    Java jdbc数据库连接池总结

    Java JDBC 数据库连接池总结 Java 语言中,JDBC(Java DataBase Connection)是应用程序与数据库沟通的桥梁。在 Web 应用开发的早期,主要使用的技术是 CGIASPPHP 等。之后,Sun 公司推出了基于 Java 语言的 ...

    java_jdbc数据库连接池总结

    Java JDBC 数据库连接池总结 Java JDBC 数据库连接池是 Java 应用程序访问数据库的基本原理...Java JDBC 数据库连接池是一种高效、可靠的数据库访问技术,广泛应用于大型电子商务网站、企业级应用和数据库应用等领域。

    JDBC数据库连接池实现原理

    实现JDBC数据库连接池的基本步骤如下: 1. **选择连接池实现**:首先,我们需要选择一个合适的数据库连接池实现,如Apache的DBCP、C3P0、HikariCP或Tomcat JDBC连接池等。这些连接池库提供了管理和维护数据库连接的...

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

    总的来说,Java JDBC数据库连接池是提升Web应用性能的重要技术,通过有效的连接管理和复用,它降低了数据库操作的开销,提升了系统的稳定性和响应速度。在开发过程中,选择合适的连接池实现,并对其进行合理配置,是...

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

    `www.pudn.com.txt`可能包含了一些关于实现过程的文档或示例代码,而`一种简单JDBC数据库连接池的实现`可能是源代码文件,具体实现细节需要查看这些文件才能得知。通常,自定义连接池的实现会包括创建一个连接池类,...

    Java的JDBC数据库连接池实现方法.doc

    Java JDBC数据库连接池实现方法 Java 数据库连接池是指在 Java 应用程序中对数据库连接的管理和优化,提高数据库访问的效率和性能。 Java 中的数据库连接池可以分为两类:一种是基于应用服务器的连接池,另一种是...

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

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

    jdbc数据库连接池

    JDBC数据库连接池是一种存储和管理多个数据库连接的技术,这些连接可以被应用程序重复使用。连接池预先创建一定数量的数据库连接,并维护这些连接的状态。当应用程序需要访问数据库时,连接池会分配一个空闲的连接;...

    JAVA 完整的数据库连接池实现

    数据库连接池是一种对象池设计模式的应用,它维护了一组数据库连接,供多个应用程序共享。通过复用已建立的连接,避免了频繁创建和销毁连接带来的开销,从而提升了系统性能。数据库连接池还提供了诸如连接管理和资源...

    JDBC数据库连接池总结.pdf

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

    Java jdbc数据库连接池总结2

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

    JDBC数据库连接池总结.doc

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

    javajdbc数据库连接池总结.pdf

    总之,Java JDBC数据库连接池是提高Web应用性能、优化数据库资源管理的重要手段。通过连接池,不仅可以减少数据库连接的创建和销毁开销,还能有效控制并发下的资源分配,从而提高系统的稳定性和响应速度。

    Java_jdbc数据库连接池总结

    总的来说,Java JDBC数据库连接池是提升Web应用性能、优化资源管理的重要手段,它解决了传统JDBC模式下数据库连接的低效问题,增强了系统的稳定性和可扩展性。在实际开发中,选择合适的连接池实现(如Apache DBCP、...

    JDBC数据库连接池相关jar包

    总结起来,"JDBC数据库连接池相关jar包"涉及到的是Java Web开发中的核心组件,它们在提高数据库访问效率、优化资源利用、简化数据库操作以及提供监控能力等方面起着关键作用。理解并熟练掌握这些技术,对于任何Java...

    03-数据库连接池驱动_数据库连接池;驱动_

    本资源"03-数据库连接池驱动"包含了三种常用的数据库连接池驱动:C3P0、Druid和DBCP,它们都是为了优化数据库连接管理和复用而设计的。 首先,C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3...

    Java_jdbc数据库连接池总结.doc

    ### Java JDBC 数据库连接池详解 #### 一、引言 随着互联网技术的快速发展和广泛应用,Web应用程序的需求日益增加,特别是在企业级应用和电子商务领域。传统C/S(客户端/服务器)架构逐步被B/S(浏览器/服务器)...

Global site tag (gtag.js) - Google Analytics