论文部分内容阅读
摘要:该文介绍了基于JDBC的数据库连接池的工作原理,提出了一个高效的连接管理策略,最后给出了数据库应用的具体实现。
关键词:JDBC;数据库;数据库连接池
中图分类号:TP311.13 文献标识码:A 文章编号:1009-3044(2009)15-3859-02
Improvement and Application of Database Connection Pool Technology Based on JDBC
DAI Wei-wei
(Shao Xing Science and Artist School Computer Center,Shao Xing 312000, China)
Abstract: The article descrbs the working principle of database connection pool based on JDBC,Offers a high-efficient connection to manager the tactics in practical application. At last Gives the concrete realization of database applications.
Key words: JDBC; database; database Connection Pool
1 引言
随着网络的发展,各种网站越来越多。而对于基于数据库的Web系统来说,数据库连接是增加系统开销的主要原因之一,它的好坏直接影响到数据库服务器的性能。传统的数据库连接是在主程序(如Servlet、Beans)中建立数据库连接,然后进行SQL操作取出数据,最后结束时断开数据库连接。这就使得每次用户的请求都需要建立一次数据库连接,这就大大地增加系统开销,并且降低数据库服务器的性能。此外,采用传统的连接方式,需要你去管理每一个连接,并确保他们能被正确关闭,如果出现程序异常而导致某些连接未能正常关闭,这将导致数据库系统中的内存泄露,最终我们将不得不重启数据库。由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理。这就需要引入一种高效率的资源管理机制来解决该问题。
2 基于JDBC的传统数据库访问机制
JDBC(Java Database Connectivity)是Java与数据库的接口规范,它由一组用Java编程语言编写的类和接口组成。它可分为两类:面向开发人员的JDBC API和面向数据库开发商的底层的JDBC driver API。而JDBC驱动程序由实施了这些接口的类组成。
下面先介绍Java语言通过JDBC技术访问数据库的过程。
①装载JDBC驱动程序;
②获得JDBC数据库连接;
③创建Statement对象;
④执行SQL语句;
⑤处理结果;
⑥关闭数据库连接。
分析以上内容,我们可以这样理解:用户每次的访问都需要向数据库服务器提出连接请求,而且每次使用后都要关闭。这使得数据库连接效率极低。
下面将介绍一种高效率的资源管理机制—数据库连接池。
3 数据库连接池的工作原理
数据库连接池的实现原理就是为数据库连接建立一个“缓冲池”,预先在这个"缓冲池"中放入一定数量的数据库连接,当应用程序需要时,就从“缓冲池”中取出一个连接,使用完后再放回“缓冲池”中。同时我们通过设置连接池最大连接数来防止系统无穷无尽地与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据。连接池主要包括三个方面:连接池的建立、管理和关闭。下面将主要讨论它们及连接池的配置。
3.1 建立连接池
在系统初始化时根据连接配置文件Connections.properties建立连接池并创建一定数量的数据库连接,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。以后所使用的连接都是从该连接池中获取的。Java中提供了很多容器类可以方便的构建连接池,如:Vector、Stack、Servlet、Bean等。
3.2 连接池的管理
连接池管理是连接池机制的核心,对系统的性能有很大的影响。当连接池建立后,如何对连接池中的连接进行管理,解决好连接池内连接的分配和释放,对系统的性能有很大的影响。连接的合理分配、释放可提高连接的复用,降低了系统建立新连接的开销,同时也加速了用户的访问速度。
連接池管理是采用两级连接池一空闲池和使用池。空闲池中存放目前还没有分配出去的连接,一旦一个连接被分配出去,它就会被放入到使用池中,并且增加引用记数。这里的引用记数(ReferenceCounting)是一种对于复用资源广泛使用的设计模式。我们把该方法运用到对于连接的分配释放上。每一个数据库连接,保留一个引用记数,用来记录该连接的使用者的个数。
具体的实现方法是:
当用户请求数据库连接时,首先检查空闲池内有没有空闲的连接(是指未分配的连接),如果有就把建立时间最长的连接分配给他,在此先判断该连接是否有效即引用记数是否小于可用次数(ConnectionUseCount),如果小于就分配给用户,否则就把该连接从空闲池中删掉,重新检查空闲池是否有连接;
如果没有连接则检查当前所开连接池是否达到其最大的连接数,如果没有达到,就按设定的WaitConnectionTime(最大等待时间)进行等待一段时间;如果达到就,如果达到则如果没达到就重新创建一个连接给请求的用户。如果等待WaitConnectionTime后仍没有空闲连接,则返回空值(NULL)给用户。如果在等待的时间里,有连接被释放出来就可以把这个连接分配给等待的用户。
如果存在则取出可用连接对该连接把连接分配给客户并作相应处理(即标记该连接为正在使用,引用记数加1);如果没有空闲连接,则查看当前所开的连接数是不是已经达到MaxConnections(最大连接数)。
释放数据库连接时要做三件事:首先有一个等待,询问本次连接中是否还有同一事务的其他SQL语句,如有则接着本次连接继续操作;如无则计算该连接对象的引用次数并判断是否超过了该连接的可用次数,如果超过就从连接池中删除该连接,以防止同一个连接使用次数过多,导致连接不稳定,否则就将该连接放入空闲池并设置为空闲状态,可供再次复用;最后检查当前连接池内空闲连接数是否小于MinConnections(最少连接数),若小于就新建若干个空闲连接,使连接池动态地保持一定量的空闲连接;否则关闭该连接。我们可以看出正是这套策略保证了数据库连接的有效复用,避免频繁地建立、释放连接所带来的系统资源开销。
3.3 连接池的关闭
当应用程序退出时,应关闭连接池,此时应把在连接池建立时向数据库申请的连接对象统一归还给数据库(即关闭所有数据库连接),这与连接池的建立正好是一个相反过程。
3.4 连接池的配置
数据库连接池到底要放置多少个连接,这是个配置策略。这里的配置策略是:根据具体的应用需求,给出一个初始的连接池连接数目以及一个连接池可以承受的最大连接数目。本方案就是按照这个策略实现的。
4 数据库连接池的具体实现
从连接池的基本原理可以发现,一个连接池在创建和管理的过程中是由一组基本属性和接口来控制的。它们控制着连接池和每个连接对象的有效状态值,同时也影响着连接池的性能。基本方法如下:
Public class DBConnectionsPool {
MinConnections:初始化时连接池建立的最少连接数,即连接池动态维持的空闲连接数;
MaxConnections:连接池中最大连接数;
ConnectionUseCount:一个连接的最大使用次数;
WaitConnectionTime :等待分配空闲连接的最大等待时间;
Connections:当前的连接数即动态维持的连接数;
WaitReleaseTime:连接释放前的等待时间;
Public Synehronized void freeConnection(Connection con)//将连接返回给连接池
Public Synehronized Connection getConnection()//从连接池获得可用连接
Public Synehronized Connection getConnection(long maxWaitTime)//从连接池获取可用连接,并指定客户程序能够等待的最长时间。
Private Connection newConnection()//創建新连接
Public synehronized void release()//关闭所有连接。
}
Public class DBConnectionManager{
GetInstance()方法//访问连接池的唯一实例
Private DBConnectionManager()//建构函数私有以防止其它对象创建本类实例
GetResourceASStream()方法//用于定位并打开外部文件
Connections.properties//属性文件,它包含定义连接池的键一值对。
LoodDrivers()方法//实现装载和注册所有在drivers属性中指定的JDBC驱动程序
CreatePools()//创建连接池对象。
Hashtable类//实现连接池名字到连接池对象之间的映射。
public void freeConnection(String name, Connection con)// 释放一个连接,//name是一个连接池对象的名字
public Connection getConnection(String name)//从名字为name的连接池对象//中得到一个连接
public Connection getConnection(String name, long time)//从名字为name的连接池对象中取得一个连接,time是等待时间
}
对于大型的企业级应用,常常需要同时连接不同的数据库(如连接Oracle和Sybase)。我们先建立配置文件并且存放多个数据库的基本信息,然后通过读取文件的信息来分别创建多个连接池类的实例,每一个实例都是一个特定数据库的连接池。连接池管理类实例为每个连接池实例取一个名字,通过不同的名字来管理不同的连接池。当所连接的数据库服务器有改动时,通过重新设置配置文件,可以连接各种数据库服务器。连接池初始化之前,首先读入配置文件,下面介绍一个关于SQL 2000的例子:
jdbc.drivers= com.microsoft.jdbc.sqlserver.SQLServerDriver
jdbc.url= jdbc:microsoft:sqlserver://localhost:3306/corejava
jdbc.username=dww
jdbc.password=123456
5 结束语
在使用JDBC进行与数据库连接有关的应用开发中,对于众多用户访问的Web应用,采用数据库连接池技术的系统在效率和稳定性上比采用传统的其他方式的系统要好很多。该文在原有的JDBC上提出一个合理、高效的数据库连接池的设计与实现,避免了对于连接的任意、无规则的使用,使得数据库连接可以得到高效安全的复用,提高系统的效率。
参考文献:
[1] 梁立新.项目实践精解:Java Web应用开发[M].北京:电子工业出版社.2007.
[2] 王秀义.基于JDBC的数据库连接池及实现[J].计算机系统应用,2004,(4):36-39.
[3] 成培,李峰,王畅.连接池数据库访问技术深入研究[J].计算机工程与设计,2007,(28):509-511.
[4] 商杰,朱站立.数据库连接技术研究与应用[J].现代电子技术,2007.(5):95-97.
[5] 王士信,喻国平.基于JSP的数据库连接池及其应用[J].微计算机信息,2008,(24):137-138,152.
关键词:JDBC;数据库;数据库连接池
中图分类号:TP311.13 文献标识码:A 文章编号:1009-3044(2009)15-3859-02
Improvement and Application of Database Connection Pool Technology Based on JDBC
DAI Wei-wei
(Shao Xing Science and Artist School Computer Center,Shao Xing 312000, China)
Abstract: The article descrbs the working principle of database connection pool based on JDBC,Offers a high-efficient connection to manager the tactics in practical application. At last Gives the concrete realization of database applications.
Key words: JDBC; database; database Connection Pool
1 引言
随着网络的发展,各种网站越来越多。而对于基于数据库的Web系统来说,数据库连接是增加系统开销的主要原因之一,它的好坏直接影响到数据库服务器的性能。传统的数据库连接是在主程序(如Servlet、Beans)中建立数据库连接,然后进行SQL操作取出数据,最后结束时断开数据库连接。这就使得每次用户的请求都需要建立一次数据库连接,这就大大地增加系统开销,并且降低数据库服务器的性能。此外,采用传统的连接方式,需要你去管理每一个连接,并确保他们能被正确关闭,如果出现程序异常而导致某些连接未能正常关闭,这将导致数据库系统中的内存泄露,最终我们将不得不重启数据库。由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理。这就需要引入一种高效率的资源管理机制来解决该问题。
2 基于JDBC的传统数据库访问机制
JDBC(Java Database Connectivity)是Java与数据库的接口规范,它由一组用Java编程语言编写的类和接口组成。它可分为两类:面向开发人员的JDBC API和面向数据库开发商的底层的JDBC driver API。而JDBC驱动程序由实施了这些接口的类组成。
下面先介绍Java语言通过JDBC技术访问数据库的过程。
①装载JDBC驱动程序;
②获得JDBC数据库连接;
③创建Statement对象;
④执行SQL语句;
⑤处理结果;
⑥关闭数据库连接。
分析以上内容,我们可以这样理解:用户每次的访问都需要向数据库服务器提出连接请求,而且每次使用后都要关闭。这使得数据库连接效率极低。
下面将介绍一种高效率的资源管理机制—数据库连接池。
3 数据库连接池的工作原理
数据库连接池的实现原理就是为数据库连接建立一个“缓冲池”,预先在这个"缓冲池"中放入一定数量的数据库连接,当应用程序需要时,就从“缓冲池”中取出一个连接,使用完后再放回“缓冲池”中。同时我们通过设置连接池最大连接数来防止系统无穷无尽地与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据。连接池主要包括三个方面:连接池的建立、管理和关闭。下面将主要讨论它们及连接池的配置。
3.1 建立连接池
在系统初始化时根据连接配置文件Connections.properties建立连接池并创建一定数量的数据库连接,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。以后所使用的连接都是从该连接池中获取的。Java中提供了很多容器类可以方便的构建连接池,如:Vector、Stack、Servlet、Bean等。
3.2 连接池的管理
连接池管理是连接池机制的核心,对系统的性能有很大的影响。当连接池建立后,如何对连接池中的连接进行管理,解决好连接池内连接的分配和释放,对系统的性能有很大的影响。连接的合理分配、释放可提高连接的复用,降低了系统建立新连接的开销,同时也加速了用户的访问速度。
連接池管理是采用两级连接池一空闲池和使用池。空闲池中存放目前还没有分配出去的连接,一旦一个连接被分配出去,它就会被放入到使用池中,并且增加引用记数。这里的引用记数(ReferenceCounting)是一种对于复用资源广泛使用的设计模式。我们把该方法运用到对于连接的分配释放上。每一个数据库连接,保留一个引用记数,用来记录该连接的使用者的个数。
具体的实现方法是:
当用户请求数据库连接时,首先检查空闲池内有没有空闲的连接(是指未分配的连接),如果有就把建立时间最长的连接分配给他,在此先判断该连接是否有效即引用记数是否小于可用次数(ConnectionUseCount),如果小于就分配给用户,否则就把该连接从空闲池中删掉,重新检查空闲池是否有连接;
如果没有连接则检查当前所开连接池是否达到其最大的连接数,如果没有达到,就按设定的WaitConnectionTime(最大等待时间)进行等待一段时间;如果达到就,如果达到则如果没达到就重新创建一个连接给请求的用户。如果等待WaitConnectionTime后仍没有空闲连接,则返回空值(NULL)给用户。如果在等待的时间里,有连接被释放出来就可以把这个连接分配给等待的用户。
如果存在则取出可用连接对该连接把连接分配给客户并作相应处理(即标记该连接为正在使用,引用记数加1);如果没有空闲连接,则查看当前所开的连接数是不是已经达到MaxConnections(最大连接数)。
释放数据库连接时要做三件事:首先有一个等待,询问本次连接中是否还有同一事务的其他SQL语句,如有则接着本次连接继续操作;如无则计算该连接对象的引用次数并判断是否超过了该连接的可用次数,如果超过就从连接池中删除该连接,以防止同一个连接使用次数过多,导致连接不稳定,否则就将该连接放入空闲池并设置为空闲状态,可供再次复用;最后检查当前连接池内空闲连接数是否小于MinConnections(最少连接数),若小于就新建若干个空闲连接,使连接池动态地保持一定量的空闲连接;否则关闭该连接。我们可以看出正是这套策略保证了数据库连接的有效复用,避免频繁地建立、释放连接所带来的系统资源开销。
3.3 连接池的关闭
当应用程序退出时,应关闭连接池,此时应把在连接池建立时向数据库申请的连接对象统一归还给数据库(即关闭所有数据库连接),这与连接池的建立正好是一个相反过程。
3.4 连接池的配置
数据库连接池到底要放置多少个连接,这是个配置策略。这里的配置策略是:根据具体的应用需求,给出一个初始的连接池连接数目以及一个连接池可以承受的最大连接数目。本方案就是按照这个策略实现的。
4 数据库连接池的具体实现
从连接池的基本原理可以发现,一个连接池在创建和管理的过程中是由一组基本属性和接口来控制的。它们控制着连接池和每个连接对象的有效状态值,同时也影响着连接池的性能。基本方法如下:
Public class DBConnectionsPool {
MinConnections:初始化时连接池建立的最少连接数,即连接池动态维持的空闲连接数;
MaxConnections:连接池中最大连接数;
ConnectionUseCount:一个连接的最大使用次数;
WaitConnectionTime :等待分配空闲连接的最大等待时间;
Connections:当前的连接数即动态维持的连接数;
WaitReleaseTime:连接释放前的等待时间;
Public Synehronized void freeConnection(Connection con)//将连接返回给连接池
Public Synehronized Connection getConnection()//从连接池获得可用连接
Public Synehronized Connection getConnection(long maxWaitTime)//从连接池获取可用连接,并指定客户程序能够等待的最长时间。
Private Connection newConnection()//創建新连接
Public synehronized void release()//关闭所有连接。
}
Public class DBConnectionManager{
GetInstance()方法//访问连接池的唯一实例
Private DBConnectionManager()//建构函数私有以防止其它对象创建本类实例
GetResourceASStream()方法//用于定位并打开外部文件
Connections.properties//属性文件,它包含定义连接池的键一值对。
LoodDrivers()方法//实现装载和注册所有在drivers属性中指定的JDBC驱动程序
CreatePools()//创建连接池对象。
Hashtable类//实现连接池名字到连接池对象之间的映射。
public void freeConnection(String name, Connection con)// 释放一个连接,//name是一个连接池对象的名字
public Connection getConnection(String name)//从名字为name的连接池对象//中得到一个连接
public Connection getConnection(String name, long time)//从名字为name的连接池对象中取得一个连接,time是等待时间
}
对于大型的企业级应用,常常需要同时连接不同的数据库(如连接Oracle和Sybase)。我们先建立配置文件并且存放多个数据库的基本信息,然后通过读取文件的信息来分别创建多个连接池类的实例,每一个实例都是一个特定数据库的连接池。连接池管理类实例为每个连接池实例取一个名字,通过不同的名字来管理不同的连接池。当所连接的数据库服务器有改动时,通过重新设置配置文件,可以连接各种数据库服务器。连接池初始化之前,首先读入配置文件,下面介绍一个关于SQL 2000的例子:
jdbc.drivers= com.microsoft.jdbc.sqlserver.SQLServerDriver
jdbc.url= jdbc:microsoft:sqlserver://localhost:3306/corejava
jdbc.username=dww
jdbc.password=123456
5 结束语
在使用JDBC进行与数据库连接有关的应用开发中,对于众多用户访问的Web应用,采用数据库连接池技术的系统在效率和稳定性上比采用传统的其他方式的系统要好很多。该文在原有的JDBC上提出一个合理、高效的数据库连接池的设计与实现,避免了对于连接的任意、无规则的使用,使得数据库连接可以得到高效安全的复用,提高系统的效率。
参考文献:
[1] 梁立新.项目实践精解:Java Web应用开发[M].北京:电子工业出版社.2007.
[2] 王秀义.基于JDBC的数据库连接池及实现[J].计算机系统应用,2004,(4):36-39.
[3] 成培,李峰,王畅.连接池数据库访问技术深入研究[J].计算机工程与设计,2007,(28):509-511.
[4] 商杰,朱站立.数据库连接技术研究与应用[J].现代电子技术,2007.(5):95-97.
[5] 王士信,喻国平.基于JSP的数据库连接池及其应用[J].微计算机信息,2008,(24):137-138,152.