`

Snap ConnectionPool简介(图)- -

阅读更多

Snap ConnectionPool简介(图)- -

                                      

 

【虎.无名】Jdbc连接池接口有两种,目前的主流连接池,都是基于DataSource接口的。而下面这个,则直接基于原始Conntion和Statement等。Snap ConnectionPool的特点是,不仅仅缓存Connection,还对Statement和ResultSet等做了足够的缓存,通过超时回收来确保可靠资源释放。

产品 http://www.snapbug.net/product/snappool/product_sp_01.htm

<!---->
简介 | 下载 | FAQ
 
<!---->
简介

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

  为了简化数据库开发,缺省有效地管理数据库资源,Snap-ConnectionPool以最简单的方式,为应用供以一个有效的数据库资源管理工具。

 

体系结构

  在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也有相应的机制处理。合理运用Connection和Statement之间的关系,可以更大限度地使用资源。所以,Snap-ConnectionPool封装了Connection资源,通过内部管理PooledConnection,为应用系统提供更多的Statement资源。

  • 资源连锁管理。Snap-ConnectionPool包含的三种逻辑对象,继承了JDBC中相应对象之间的从属关系。在内部管理中,也依照从属关系进行连锁管理。例如:判断一个Connection是否超时,需要根据所包含的Statement是否活跃;判断Statement也要根据ResultSet的活跃程度。

 

 

工作机制

  Snap-ConnectionPool以缓冲池的机制,在一定数量上限范围内,控制管理Connection,Statement和ResultSet。任何数据库的资源是有限的,如果被耗尽,则无法获得更多的数据服务。在大多数情况下,资源的耗尽不是由于应用的正常负载过高,而是程序原因。在实际工作中,数据资源往往是瓶颈资源,不同的应用都会访问同一数据源。其中某个应用耗尽了数据库资源后,意味其他的应用也无法正常运行。因此,Snap-ConnectionPool的第一个任务是限制:每个应用或系统可以拥有的最大资源。也就是确定连接池的大小(PoolSize)。

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

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

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

 

应用范例

  没有使用连接池的,常规的JDBC范例:


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();


  使用Snap-ConnectionPool连接池范例:


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 here

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


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

 

- 作者: nike_liu 2006年05月25日, 星期四 10:28

分享到:
评论
1 楼 to_zoe_yang 2011-04-22  
不错~正在用呢

相关推荐

Global site tag (gtag.js) - Google Analytics