APP下载

连接池访问数据库的研究与应用

2017-11-18戴长秀

计算机时代 2017年11期
关键词:静态动态

戴长秀

摘 要: 应用程序用JDBC访问数据库需要频繁的建立连接和关闭连接,由于数据库连接数的限制,当用户数、连接数达到一定程度时,用JDBC访问数据库的速度将会明显下降,甚至需要重启数据库系统,这极大地降低了数据库应用系统的性能。连接池较好地解决了上述问题,避免了连接数增加引起的数据库性能瓶颈问题。文章介绍了连接池的静态、动态创建,引用记数法分配连接等实现原理,对连接池的配置进行了论述。实践表明,连接池可以很好地提高数据库应用系统的整体性能。

关键词: 连接池; 静态; 动态; 引用记数

中图分类号:TP311.52 文献标志码:A 文章编号:1006-8228(2017)11-20-03

Research and application of connection pool to access database

Dai Changxiu

(Department of Information Science and Technology, Guangdong University of Foreign Studies South China Business College, Guangdong, Guangzhou 510545, China)

Abstract: The applications using JDBC to access database need to establish and close the connections frequently, because of the limitation of database connection, when the number of users, the number of connections increase to a certain extent, the speed of accessing database with JDBC will be decreased obviously, even need to restart the database system, which greatly reduces the performance of database application system. The connection pool solves the above problem well and avoids the bottleneck of database performance caused by the increase of the connection number. This paper introduces the principle of the static and dynamic creation of connection pool, and the principle of distributing connections with reference counting method, and discusses the configuration of connection pool. The practice shows that the connection pool can improve the overall performance of database application system.

Key words: connection pool; static; dynamic; reference counting

0 引言

Web应用程序最常用的数据管理方式就是使用关系数据库,往往都是用数据库存储的信息动态生成Web页面[1]。在基于JDBC访问数据库方式中,每个用户在请求访问数据库前都必须先建立连接,建立连接将会消耗系统一定资源,延长访问数据库的时间。当然,如果是单个用户请求访问,这个延时是比较小的,用户体会不到。但是,如果是批量用户、批量请求,这个延时将会急速剧增。同时还可能出现由于连接的不及时关闭而导致数据库内存泄露,数据库系统重启,从而系统无法响应用户请求问题。众所周知,每种数据库在同一时刻都有允许的最大连接数,随着流量、用户的增加,数据库连接数达到一定数量时,数据库的性能就会急剧下降,甚至崩溃。

数据库连接池技术很好的解决了上述问题,连接池通过预先建立一定数量的数据库连接为应用程序提供连接。当应用程序访问数据库时,应用程序就可以从连接池中取出一个事先建立好的数据库连接来访问数据库,从而免去每次访问数据库时建立数据库连接的开销,同时也可以减少数据库连接和断开时造成的程序错误[2]。数据库连接池技术不仅节省了数据库建立连接的时间,而且通过池化管理机制,可以有效地使用和调度连接池中的连接,从而很好地解决数据库连接数量限制问题。

1 连接池的实现原理

服务器在启动时创建连接池,同时建立一定数量的数据库连接。当用户请求数据库连接时,服務器为其分配连接。当用户请求数量超出了已建立好的数据库连接数目时,服务器为其创建新的数据库连接或者复用已分配出去的数据库连接或者处于等待状态。通常情况下,使用连接池来访问数据库包含以下两个步骤:

⑴ 创建连接池;

⑵ 分配、释放连接。

1.1 创建连接池

创建连接池的方法有静态和动态之分,所谓静态是指,池中的连接是系统初始化时已创建好的,并且不能随意的关闭,这样就可以避免因连接随意建立、关闭而造成的系统开销[3]。在系统初始化时,根据配置文件中的参数创建数据库连接并放置在连接池中,以后应用程序使用数据库连接时就从该连接池中获取,连接池相对于应用程序来说是惟一的,数据库连接数也是固定的。所谓的动态是指可以动态的加载、修改、删除连接池,可以为不同类型的数据库同时创建连接池,可以灵活地配置连接池参数。动态方法解决了静态方法中静态加载连接池的局限性,解决了连接池不能适时增删改,配置参数不能根据应用变化灵活调整的问题[4]。endprint

1.2 分配、释放连接

创建好连接池后,需要提供一套有效的分配连接机制以保证数据库连接的有效使用。當应用程序请求一个数据库连接时,连接池通常以连接建立时间长短为分配原则为该请求分配一个建立时间最长的空闲的连接,此处的空闲是指没有被分配出去的连接,如果连接池中没有空闲连接,则检查当前连接池中连接数是否达到设定的最大值,如果没有达到就新建一个连接,如果已达到连接池中所允许的最大连接数,则该请求等待一定时间,如果在设定的等待时间内还没有数据库连接被释放出来,则返回空值。

连接池中最小连接数的检测有动态和静态两种方法,动态方法是指每隔一定时间系统自行检测连接池中连接数,如果发现数据库连接数低于最小连接数的设定值,则补充相应数量的新连接,从而保证连接池的正常运转。静态方法是指发现空闲连接不够使用时系统再去检测数据库连接数并与设定的最小连接数进行对比。

在分配数据连接时,除了使用空闲连接外,也可以复用正在使用的数据库连接,复用正在使用的数据库连接通常使用Reference Counting(引用记数)方法。该方法会为每一个数据库连接保留一个引用记数值,用来记录该连接的使用者的个数。具体操作是采用两级连接池,一个空闲池用于存放目前还没分配出去使用的的连接,另一个使用池存放目前已被分配出去使用的连接,并且为每个数据库连接设置相应的引用记数值。当所有的数据库连接都已分配出去使用时则选择引用记数值较小的数据库连接进行复用,这样可以避免随意选择数据库连接进行复用,达到数据库连接可管理的目的[5]。

2 静态连接池的配置

连接池应建立多少数据库连接数,才能使系统的性能处于最佳状态,发挥最好的性能,这个值的设置需要参考系统的用户数,需要开发人员经过反复测试,最后才能找到最佳的设置值。

2.1 配置参数介绍

连接池的配置方法有很多,可以在Tomcat下配置,也可以使用JSP的框架如Struts、Spring和Hibernate,还可以使用开源提供的连接池组件。在此,只针对Tomcat下连接池的配置进行介绍。JDBC2.0提供了javax.sql.DataSourse接口负责数据库的建立,在应用时无需编写数据库连接代码,就可以直接从数据源中获得数据库连接。在DataSourse接口中预先建立好数据库连接并放置在连接池中,当用户请求访问数据库时,应用程序直接从连接池中取出空闲的连接,访问结束后,再将连接返回给连接池。Tomcat服务器正是通过DataSourse接口获取数据库连接,虽然不能为DataSourse接口创建实例,但是可以通过Java命名和目录接口(JNDI)来获取DataSourse接口的引用,在配置数据源时需要使用的有关参数及含义如下。

Name:设置数据源的JNDI名。

Type:设置数据源的类型。

Auth:设置数据源的管理者,有两个可选值Container和Application,Container表示由容器来创建和管理数据源,Application表示由Web应用来创建和管理数据源。

driverClassName:设置连接数据库的JDBC驱动程序。

url:设置连接数据库的路径。

username:设置连接数据库的用户名。

password:设置连接数据库的密码。

maxActive:设置连接池中处于活动状态的数据库连接的最大数目,0表示不受限制。

maxIdle:设置连接池中处于空闲状态的数据库连接的最大数目,0表示不受限制。

maxWait:设置当连接池中没有处于空闲状态的连接时,请求数据库连接的请求的最长等待时间(单位为ms),如果超出该时间将抛出异常,-1表示无限期等待。

2.2 数据源的配置

以SQL Server 2008为例,介绍在Tomcat 8.0下数据库连接池的配置。

⑴ 复制数据库驱动包。将SQL Server数据库的JDBC驱动包sqljdbc.jar或者sqljdbc4.jar复制到Tomcat安装路径下的lib文件夹中。

⑵ 配置数据源。配置数据源时,可以将其配置到Tomcat安装目录下的conf\server.xml文件中,也可以将其配置到Web工程目录下的META-INF\context.xml文件中,建议采用后者,因为这样配置的数据源更有针对性,配置数据源的代码如下:

auth="Container"

type="javax.sql.DataSource"

username="sa"

password="123456"

driverClassName="com.microsoft.sqlserver.jdbc

.SQLServerDriver"

url="="jdbc:sqlserver://127.0.0.1:1433;

DatabaseName=db_database"

maxActive="6"

maxIdle="2"/>

3 连接池访问数据库的设计实现

创建名为JDBConnection.java类文件,在其构造方法中获取DataSourse接口的引用。编写DBTableDisplay.jsp文件,显示数据库表中信息。

JDBConnection类文件核心代码如下:

……endprint

public class JDBConnection {

……

private Context ctx=null;

private Connection conn=null;

private DataSourse ds;

……

public JDBConnection() {

//类的构造方法,为Connection对象赋值

try {

ctx=new InitialContext();

ds=(DataSource)ctx.lookup("java:comp/env/jdbc/my_db"); //获取连接池DataSource的引用

conn=ds.getConnection(); //得到连接

} catch(Exception e){……}

……

}

public Connection getConnection() {

//获取Connection连接对象

return conn;

}

public ResultSet getResultSet(String sql) {

//获取ResultSet记录集对象

ResultSet rs;

try {

Statement stmt=conn.createStatement();

rs=stmt.executeQuery(sql);

} catch(Exception e){……}

……

return rs

}

……

}

在DBTableDisplay.jsp文件中创建JDBConnection实例,显示数据库表中的数据的核心代码如下:

……

public JDBConnection DBConnection=null;

public ResultSet rs=null;

public String sql=null;

……

DBConnection=new JDBConnection();

rs=DBConnection.getResultSet (sql);

while(rs.next() {

//对数据库表中的数据进行输出显示

}

……

4 结束语

尽管创建一个新的数据库连接所耗费的时间主要取决于网络的速度,以及应用程序与数据库存服务器的网络距离,然而这是一个比较耗时的过程。目前数据库连接池技术已经成为提高Java访问数据库效率的首选方案之一。本文针对传统访问数据库方式的不足,分析了数据库连接池技术的实现原理,并对连接池技术加以实现至应用。采用数据库连接池后,数据库请求可以直接通过连接池获得满足,不需要为该请求建立连接以及认证,从而为数据库的访问赢得了时间。尽管連接池中可能存在多个未被使用的数据库连接,这在一定程度上会浪费系统资源,但是,开发人员通过反复试验及测试,可以找到最佳的参数值从而将资源浪费减至最低。总之,使用连接池技术可以克服传统访问方式的不足,明显地提高数据库应用系统的整体性能。

参考文献(References):

[1] 张玉林.用连接池提高Servlet访问数据库的效率[J].软件技

术,2006.20:72-75

[2] 徐全生,齐祥玲.数据库连接池在考试系统中的应用[J].沈阳

工业大学学报,2007.5:582-584

[3] 刘继华.一种基于JDBC的数据库连接池的设计与实现[J].计

算机工程与应用,2003.7:183-185

[4] 汪蔚,基于Java的数据库连接池设计与优化[J].交通科技与

经济,2009.4:108-109

[5] 刘菲、游达章,基于Java的数据库连接池的设计与优化[J].微

型电脑应用,2008.24:7-9endprint

猜你喜欢

静态动态
国内动态
国内动态
国内动态
最新进展!中老铁路开始静态验收
静态随机存储器在轨自检算法
猜猜他是谁
动态
动态
油罐车静态侧倾稳定角的多体仿真计算
具7μA静态电流的2A、70V SEPIC/升压型DC/DC转换器