一个不错的JDBC连接池教程(带具体例子)

1.前言 

    数据库应用,在许多软件系统中经常用到,是开发中大型系统不可缺少的辅助。但如果对数据库资源没有很好地管理(如:没有及时回收数据库的游标(ResultSet)、Statement、连接 (Connection)等资源),往往会直接导致系统的稳定性。这类不稳定因素,不单单由数据库或者系统本身一方引起,只有系统正式使用后,随着流量、用户的增加,才会逐步显露。 

    在基于Java开发的系统中,JDBC是程序员和数据库打交道的主要途径,提供了完备的数据库操作方法接口。但考虑到规范的适用性,JDBC只提供了最直接的数据库操作规范,对数据库资源管理,如:对物理连接的管理及缓冲,期望第三方应用服务器(Application Server)的提供。 
   

    本文,以JDBC规范为基础,介绍相关的数据库连接池机制,并就如果以简单的方式实现有效地管理数据库资源介绍相关实现技术。 

2.连接池技术背景 

2.1 JDBC 

    JDBC是一个规范,遵循JDBC接口规范,各个数据库厂家各自实现自己的驱动程序(Driver),如下图所示: 

 

 

一个不错的JDBC连接池教程(带具体例子)

    这是一种 ‘爷-父-子’ 的关系,对Connection的管理,就是对数据库资源的管理。举个例子: 如果想确定某个数据库连接(Connection)是否超时,则需要确定其(所有的)子Statement是否超时,同样,需要确定所有相关的ResultSet是否超时;在关闭Connection前,需要关闭所有相关的Statement和ResultSet。 

    因此,连接池(Connection Pool)所起到的作用,不仅仅简单地管理Connection,还涉及到 Statement和ResultSet。 

2.3连接池(ConnectionPool)与资源管理 

    ConnectionPool以缓冲池的机制,在一定数量上限范围内,控制管理Connection,Statement和ResultSet。任何数据库的资源都是有限的,如果被耗尽,则无法获得更多的数据服务。 

    在大多数情况下,资源的耗尽不是由于应用的正常负载过高,而是程序原因。 

    在实际工作中,数据资源往往是瓶颈资源,不同的应用都会访问同一数据源。其中某个应用耗尽了数据库资源后,意味其他的应用也无法正常运行。因此,ConnectionPool的第一个任务是限制每个应用或系统可以拥有的最大资源,也就是确定连接池的大小(PoolSize);第二个任务是在连接池的大小(PoolSize)范围内,最大限度地使用资源,缩短数据库访问的使用周期。

    许多数据库中,连接(Connection)并不是资源的最小单元,控制Statement资源比Connection更重要。以Oracle为例:每申请一个连接(Connection)会在物理网络(如 TCP/IP网络)上建立一个用于通讯的连接,在此连接上还可以申请一定数量的Statement,同一连接可提供的活跃Statement数量可以达到几百。 在节约网络资源的同时,缩短了每次会话周期(物理连接的建立是个费时的操作)。但在一般的应用中,多数按照2.1范例操作,这样有10个程序调用,则会产生10次物理连接,每个Statement单独占用一个物理连接,这是极大的资源浪费。 ConnectionPool可以解决这个问题,让几十、几百个Statement只占用同一个物理连接, 发挥数据库原有的优点。通过ConnectionPool对资源的有效管理,应用可以获得的Statement总数达到 :(并发物理连接数) x (每个连接可提供的Statement数量) ,例如某种数据库可同时建立的物理连接数为 200个,每个连接可同时提供250个Statement,那么ConnectionPool最终为应用提供的并发Statement总数为: 200 x 250 = 50,000个。这是个并发数字,很少有系统会突破这个量级。所以在本节的开始,指出资源的耗尽与应用程序直接管理有关。 
   

    对资源的优化管理,很大程度上依靠数据库自身的JDBC Driver是否具备。有些数据库的JDBC Driver并不支持Connection与Statement之间的逻辑连接功能,如SQLServer,我们只能等待她自身的更新版本了。 

    对资源的申请、释放、回收、共享和同步,这些管理都是复杂精密的。所以,ConnectionPool的另一个功能就是封装这些操作,为应用提供简单的甚至是不改变应用风格的调用接口。 

3.简单JDBC连接池的实现 

    根据第二章中原理机制,Snap-ConnectionPool(一种简单快速的连接池工具)按照部分的JDBC规范,实现了连接池所具备的对数据库资源有效管理功能。 

3.1体系描述 

    在JDBC规范中,应用通过驱动接口(Driver Interface)直接访问数据库的资源。为了有效、合理地管理资源,在应用与JDBC Driver之间增加了连接池“ Snap-ConnectionPool”。并且通过面向对象的机制,使连接池的大部分操作是透明的。参见下图,Snap-ConnectionPool的体系: 

一个不错的JDBC连接池教程(带具体例子)

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

3.3连接池使用范例 

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

  

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

4.小结 

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

        1、对源数据库资源的保护 

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

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

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

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

来源:wangfeng8720

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2011年3月5日
下一篇 2011年3月6日

相关推荐