首页 -> 2008年第9期
基于Java的Web数据库连接池技术研究
作者:杨 瑶
一、基于Java的传统数据库访问模式
JDBC(Java DataBase Connectivity)是Java应用程序与数据库沟通的桥梁。
一般情况下,Java应用程序访问数据库传统模式基本是按以下步骤:①在主程序中通过JDBC建立数据库连接;②进行SQL操作;③断开数据库连接。在这种模式下,系统会为每个请求建立一个新的数据库连接。这种处理方式不仅简单,而且还可以在任何时候处理数据库的多用户请求。但在实际应用中却存在很多问题:
第一,要为每一次Web请求建立一次数据库连接,每建立一次数据库连接就需要花费0.05s~1s的时间,对于一次或几次操作来讲,或许您觉察不到系统的开销。但是,对于Web程序来讲,即使是在某一很短的时间段内,其操作请求数也远远不止一两次,而是数百上千次,在这种情况下,数据库连接要频繁建立、关闭,系统开销是相当大的。很多时候,这可能成为网站访问速度的瓶颈。
第二,不能控制被创建的连接对象数,系统资源被毫无顾忌的开销,最后导致系统内存溢出,服务器崩溃。
第三,必须管理每一个连接,确保它们能被正确关闭。如果出现程序异常而导致某些连接未能关闭,将导致数据库系统中的内存泄露,最终将不得不重启数据库。
因此,传统的数据库访问模式已远远不能满足访问数据库的需要。利用连接池技术可以有效地解决这些问题,并能提高系统的效率。
二、数据库连接池技术
1. 连接池的基本概念
连接池(ConnectionPool)顾名思义,就是众多连接对象的“缓冲存储池”,也就是连接对象的集合体。
2. 连接池的原理与工作机制
连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。
连接池一般由三部分组成:连接池的建立,连接池对连接的管理和连接池的关闭。
(1)连接池的建立。应用程序中要建立的是一个静态连接池,所谓静态是指连接池中的连接在系统初始化时就已分配好,且不能随意关闭连接。
(2)连接池管理策略。连接池管理策略是连接池机制的核心。当客户需访问数据库时,不是直接同数据库建立连接,而是向连接池申请一个连接。数据库访问完毕,释放连接时,并不是直接关闭连接,而是向连接池释放连接。连接池设有空闲队列和已分配队列。空闲队列存放未分配的连接,已分配队列存放正在使用的连接。当客户应用连接池请求数据库连接时,先查看池中有没有被分配的空闲连接,如果存在空闲连接则把空闲连接分配给客户,并作相应处理,主要的处理策略就是设置该连接为已使用即分配状态,即注册到已分配队列中。若连接池中没有空闲连接,则先看该连接池是否已达最大连接数,若未达到则创建新连接并设置其为已分配状态即可,已达到则只能等待其它线程释放连接再获取,超过允许的最大等待时间则此次请求无效。当客户释放连接时,唤醒所有等待连接的客户线程并做相应的处理。如果连接释放后没有等待连接的客户线程,则把它重新放回连接池中,并不关闭连接。
(3)连接池的关闭。当应用程序退出时,应关闭连接池,此时应把在连接池建立时向数据库申请的连接对象统一归还给数据库(即关闭所有数据库连接),这与连接池的建立正好是一个相反过程。
3. 连接池技术的优点
使用连接池技术的优点主要体现在以下方面:①不用为每个用户请求建立新的连接,每一个数据库连接得以高效、安全的复用,避免频繁的数据库连接建立、关闭的开销;②不用重复为连接用户名、连接密码等数据库访问的细节编码,节省编程工作量;③方便地控制连接到数据库的许可用户数,商业应用中在成本、安全性方面优势明显;④在数据库系统更换时保证应用程序不用作大的调整。
三、连接池应用实例
本文是基于一个书籍管理系统的开发来说明数据库连接池的应用。该书籍管理系统是基于JSP开发的。在这里仅列出书籍列表的实例。
1. 配置数据源
在Tomcat的服务器描述(server.xml)配置数据源。其例程如下:
<Context path=〞/jspdev〞 docBase=〞jspdev〞 debug=〞0〞 reloadable=〞true〞 crossContext=〞true〞>//这是在 Tomcat 中 jspdev的路径。
<Resource name=〞jdbc/jspdev〞 auth=〞Container〞 type=〞javax.sql.DataSource〞/>//定义数据源的名字。
<ResourceParams name=〞jdbc/jspdev〞>
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>driverClassName</parameter>
<value>com.Microsoft.jdbc.sqlserver.SQLServerDriver</value>
</parameter>// JDBC 驱动名。
<parameter>
<name>url</parameter>
<value>jdbc:Microsoft:sqlserver://127.0.0.1:1433;DatabaseName=jspdev</value>
</parameter>// 连接数据库的设置信息。
<parameter>
<name>username</parameter>
[2]