Snap-ConnectionPool
A Simple ConnectionPool
for JDBC
version 1.x
Nov. 2003
Snap-ConnectionPool for JDBC
snapbug.net
2 of 2
1.
概述
.........................................................................................................................................................3
2.
技术背景
.................................................................................................................................................3
2.1 JDBC.......................................................................................................................................3
2.2 JDBC
连接池
..........................................................................................................................4
2.3
连接池
(ConnectionPool)
与资源管理
.....................................................................................5
3.
简单快速的连接池
Snap-ConnectionPool.............................................................................................6
3.1
体系描述
.................................................................................................................................6
3.2
连接池使用范例
.....................................................................................................................7
3.3
连接池集中管理
ConnectionManager...................................................................................8
3.4
初始化
Snap-ConnectionPool.................................................................................................8
4. 连接池使用方法.....................................................................................................................................9
4.1 连接池配置文件.....................................................................................................................9
4.2 ConnectionManager..............................................................................................................11
4.2.1 ConnectionManager.version.........................................................................................11
4.2.2 ConnectionManager.debug...........................................................................................11
4.2.3 ConnnectionManager. getConnectionPool....................................................................11
4.2.4 ConnectionManager.init................................................................................................12
4.2.5 ConnectionManager.reloadProfile................................................................................12
4.3 ConnectionPool.....................................................................................................................12
5. 常见日志信息.......................................................................................................................................13
5.1 正常工作日志.......................................................................................................................13
5.2
错误日志
...............................................................................................................................15
5.2.1
无法找到类库
...............................................................................................................15
5.2.2
无法连接数据库
...........................................................................................................15
5.2.3 连接池已满...................................................................................................................15
6.
范例
.......................................................................................................................................................16
6.1
应用程序范例
.......................................................................................................................16
6.2
配置文件范例
.......................................................................................................................16
Snap-ConnectionPool for JDBC
snapbug.net
3 of 3
1
1
.
.
概
概
述
述
数据库应用,在许多软件系统中,都经常用到,是开发中大型系统不可缺少的辅助。但如果对数
据库资源的没有很好的管理(如:没有及时回收数据库的游标(ResultSet)、Statement、连接
(Connection)等资源),往往会直接导致系统的稳定性能。由于这类不稳定因素,不单单由数据库
或者系统本身一方引起,所以在开发期、以及测试期很难发现这。只有在系统正式使用后,随着
流量、用户的增加,才会逐步显露。
在基于
Java
开发的系统中,
JDBC
是程序员和数据库打交道的主要途径,提供了完备的数据库操
作方法接口。但考虑到规范的使用性,
JDBC
只提供了最直接的数据库操作规范,包括
:
直接建立
物理连接,底层的数据
SQL
操作等。而对数据库资源管理,如:对物理连接的管理及缓冲,则
期望于应用服务器(
Application Server
)的帮助。
为了简化数据库开发,缺省有效地管理数据库资源,
Snap-ConnectionPool
以最简单的方式,为应
用供以一个有效的数据库资源管理工具。
2
2
.
.
技
技
术
术
背
背
景
景
2
2
.
.
1
1
J
J
D
D
B
B
C
C
JDBC
是一个规范,遵循
JDBC
接口规范,各个数据库厂家各自实现自己的驱动程序
(Driver)
,
如下图所示
:
Snap-ConnectionPool for JDBC
snapbug.net
4 of 4
应用在获取数据库连接时,需要以
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
.
.
2
2
J
J
D
D
B
B
C
C
连
连
接
接
池
池
在标准
JDBC
对应用的接口中,并没有提供资源的管理方法。所以,缺省的资源管理由应用自己
负责。虽然在
JDBC
规范中,多次提及资源的关闭
/
回收及其他的合理运用,但最稳妥的方式,还
是为应用提供有效的管理手段。所以,
JDBC
为第三方应用服务器(
Application Server
)提供了
一个由数据库厂家实现的管理标准接口:连接缓冲
(connection pooling)
。 引 入 了 连接池
( Connection Pool )
的概念
。
JDBC
最常用的资源有三类
:
- Connection:
数据库连接。
- Statement:
会话声明。
- ResultSet: 结果集游标。
分别存在以下的关系 :
这是一种
‘
爷
-
父
-
子
’
的关系,对
Connection
的管理,就是对数据库资源的管理。举个例子
:
如果想
确定某个数据库连接(Connection)是否超时,则需要确定其(所有的)子 Statement 是否超时,同
Snap-ConnectionPool for JDBC
snapbug.net
5 of 5
样,需要确定所有相关的
ResultSet
是否超时;在关闭
Connection
前,需要关闭所有相关的
Statement
和
ResultSet
。
因此,连接池所起到的作用,不仅仅简单地管理
Connection
,还涉及到
Statement
和
ResultSet
。
2
2
.
.
3
3
连
连
接
接
池
池
(
(
C
C
o
o
n
n
n
n
e
e
c
c
t
t
i
i
o
o
n
n
P
P
o
o
o
o
l
l
)
)
与
与
资
资
源
源
管
管
理
理
ConnectionPool
以缓冲池的机制,在一定数量上限范围内,控制管理
Connection
,
Statement
和
ResultSet
。
任何数据库的资源是有限的,如果被耗尽,则无法获得更多的数据服务。在大多数情况下,资源
的耗尽不是由于应用的正常负载过高,而是程序原因。在实际工作中,数据资源往往是瓶颈资
源,不同的应用都会访问同一数据源。其中某个应用耗尽了数据库资源后,意味其他的应用也无
法正常运行。因此,
ConnectionPool
的第一个任务是限制:每个应用或系统可以拥有的最大资
源。也就是确定连接池的大小
(PoolSize)
。
ConnectionPool 的第二个任务:在连接池的大小(PoolSize)范围内,最大限度地使用资源,缩短数
据库访问的使用周期。许多数据库中,连接(Connection) 并不是资源的最小单元,控制
Statement 资源比 Connection 更重要。以 Oracle 为例:
每申请一个连接(Connection)会在物理网络(如 TCP/IP 网络)上建立一个用于通讯的连
接,在此连接上还可以申请一定数量的 Statement。同一连接可提供的活跃 Statement 数量可以
达到几百。
在节约网络资源的同时,缩短了每次会话周期(物理连接的建立是个费时的操
作)。但在一般的应用中,多数按照
2.1
范例操作,这样有
10
个程序调用,则会产生
10
次物
理连接,每个
Statement
单独占用一个物理连接,这是极大的资源浪费。
ConnectionPool
可以
解决这个问题,让几十、几百个
Statement
只占用同一个物理连接,
发挥数据库原有的优点。
注
:
对于大多数据库的
JDBC Dirver
都支持:每个物理连接
(Connection)
,可以包含上百个
Statement
。这样,每
个连接池可以在有限的
(connectionPoolSize
个
)
物理连接下,为应用系统提供的
Statement
资源可以到达
connectionPoolSize * StatementPoolSize(
这是个不小的数字
)
。但有些数据库它的
JDBC Dirver
并没有提供此优
化方法(如:
SqlServer
),即每申请一个
Statement
就会占用一个物理连接。只有更换高版本的
JDBC Dirver
解
决资源浪费的问题。
对资源的申请、释放、回收、共享和同步,这些管理是复杂精密的。所以,ConnectionPool 的另一
个功能就是,封装这些操作,为应用提供简单的,甚至是不改变应用风格的调用接口。