目 录

在java开发系统中JDBC是程序员和数据库打交道的主要途径,提供了完备的数据库操作方法接口,考虑到规范的适用性,仅
提供了数据库操作规范,而对数据库资源的管理,则由第三方应用服务器提供。看下面的例子:
import java.sql.*;


..DriverManager.registerDriver(
                   new oracle.jdbc.
                   driver.OracleDriver());
Connection dbConn = DriverManager.getConnection   
(“jdbcracle:thin127.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();
JDBC接口没有提供管理资源的规范,JDBC为第三方应用服务器(Application Server)提供了一个由数据库厂家实现的管理标准接口:连接缓冲(connection pooling)。引入了连接池( Connection Pool )的概念 ,也就是以缓冲池的机制管理数据库的资源。 

JDBC最常用的资源有三类: 

-Connection: 数据库连接。 

-Statement: 会话声明。 

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

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

连接池(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总数到达 : 

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

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