简单JDBC连接池的实现

一种简单JDBC连接池的实现   1.前言

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

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

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

参考资料:www.svn8.com


  2.连接池技术背景

Bbs.Svn8.Com

  2.1JDBC Svn中文网

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

Svn中文网

  

Svn中文网

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

Www.Svn8.Com

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 herers.close();
st.close();dbConn.close(); Www.Svn8.Com 
Www.Svn8.Com

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

Svn中文网

  2.2JDBC连接池

Svn8.Com

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

  JDBC最常用的资源有三类:

Bbs.Svn8.Com


  -Connection: 数据库连接。

Svn8.Com

  -Statement: 会话声明。 Svn中文网

  -ResultSet: 结果集游标。

参考资料:www.svn8.com


  分别存在以下的关系 :

参考资料:www.svn8.com

   参考资料:www.svn8.com

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

Svn8.Com

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

参考资料:www.svn8.com


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

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

参考资料:www.svn8.com

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

参考资料:www.svn8.com


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

  ConnectionPool的第二个任务:在连接池的大小(PoolSize)范围内,最大限度地使用资源,缩短数据库访问的使用周期。许多数据库中,连接(Connection)并不是资源的最小单元,控制Statement资源比Connection更重要。以Oracle为例: Svn中文网

  每申请一个连接(Connection)会在物理网络(如 TCP/IP网络)上建立一个用于通讯的连接,在此连接上还可以申请一定数量的Statement.同一连接可提供的活跃Statement数量可以达到几百。 在节约网络资源的同时,缩短了每次会话周期(物理连接的建立是个费时的操作)。但在一般的应用中,多数按照2.1范例操作,这样有10个程序调用,则会产生10次物理连接,每个Statement单独占用一个物理连接,这是极大的资源浪费。 ConnectionPool可以解决这个问题,让几十、几百个Statement只占用同一个物理连接, 发挥数据库原有的优点。 参考资料:www.svn8.com

  通过ConnectionPool对资源的有效管理,应用可以获得的Statement总数到达 :

Www.Svn8.Com


  (并发物理连接数) x (每个连接可提供的Statement数量) Svn8.Com

  例如某种数据库可同时建立的物理连接数为 200个,每个连接可同时提供250个Statement,那么ConnectionPool最终为应用提供的并发Statement总数为: 200 x 250 = 50,000个。这是个并发数字,很少有系统会突破这个量级。所以在本节的开始,指出资源的耗尽与应用程序直接管理有关。 Svn中文网

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

Svn中文网

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

Www.Svn8.Com

本文来自Svn中文网[www.svn8.com]转发请保留本站地址:http://www.svn8.com/java/J2EE/20100319/26831.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值