JSP数据库连接池的研究与实现(源代码+论文)
在基于JDBC的数据库实际应用开发中,对数据库连接的管理是一个重点也是一个难点,频繁对数据库的连接与关闭操作、多客户对数据库的并发访问,一定程度上决定了WEB系统的响应以及应用性能。使用数据库连接池方式能对数据库的连接进行管理和维护,上层应用程序通过数据库连接池使用数据库资源能提升系统性能,充分利用系统资源。文章通过介绍、分析数据库连接池工作的基本原理,了解目前流行的WEB服务器在数据库连接池方面的使用现状后,总结了一些数据库连接池开发程序中容易忽略的问题。并在学习掌握了实现连接池的关键技术后给出了一个较为高效的连接池管理策略,在这种策略思想的指导下实际开发出一个数据库连接池模块,使得上层应用通过本连接池访问数据库资源变得相对高效和容易,从实际上论证了这种设计方案的可行性。
随着信息技术的高速发展与广泛应用,数据库技术在信息技术领域中的位置越来越重要。传统的开发模式是:首先在主程序(如Servlet、Beans)中建立数据库连接;然后进行SQL操作,对数据库中的对象进行查询、修改和删除等;最后断开数据库连接。使用这种开发模式,对于一个简单的数据库应用,由于数据库的访问不是很频繁,只需要在访问数据库时创建一个连接,用完后就关闭它,这样做不会明显增大系统的开销。但是对于一个复杂的数据库应用,情况就完全不同了,尤其是大型电子商务网站,同时可能有几百人甚至几千人在线。在这种情况下,用户操作频繁的建立、关闭数据库,会极大的降低系统的性能,增大系统的开销,迫使网站的响应速度下降,严重的甚至会造成服务器的崩溃。针对这些突出问题,采用运行速度更快、数据库访问效率更高的数据库连接池技术,以提高系统的运行效率将是至关重要的,因此本文提出了一种基于数据库连接池技术的有效解决方法。以加强对数据库操作的性能,改善资源使用率,提高应用程序的响应能力。
一个应用系统,同时有几百人甚至几千人频繁的进行数据库连接操作势必占用很多的系统资源,严重的甚至会造成服务器的崩溃。对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将不得不重启数据库。还有,如果不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,连接过多也可能导致内存泄漏,服务器崩溃。针对这些突出问题,因此提出了一种基于数据库连接池技术的有效解决方法。简而言之,数据库连接池主要作用是负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不再是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。
由于JDBC的API中没有提供连接池的方法。一些大型的WEB应用服务器如WebLogic、WebSphere等都自带有连接池。不同的是,tomcat并没有自已开发连接池,而是集成的apache的另外一个开源项目DBCP连接池。BEA的WebLogic自身带有一个连接池,这个连接池无法与WebLogic分离,但是也必须有其第三方的专用类方法支持连接池的用法,而不需要用户再去写一个连接池。以下是一些第三方连接池:
DBCP应Apache的Jakarta组织开发,是目前使用较为广泛的一个连接池,一是因为tomcat自带的就是这个连接池,二是因为开源免费。由于其使用的稳定性不是很好,著名的开源项目hibernate不再提供对它的支持。DBCP部分参数说明如下:
dataSource:要连接的 dataSource (通常我们不会定义在 server.xml)。
defaultAutoCommit:对于事务是否 autoCommit, 默认值为 true。
defaultReadOnly:对于数据库是否只能读取, 默认值为 false。
driverClassName:连接数据库所用的 JDBC Driver Class。
maxActive:最大连接数据库连接数,设 0 为没有限制。
maxIdle:最大等待连接中的数量,设 0 为没有限制。
maxWait:最大等待秒数, 单位为 ms, 超过时间会出错误信息。
password:登陆数据库所用的密码。
url:连接数据库的 URL。
username:登陆数据库所用的帐号。
validationQuery:验证连接是否成功, SQL SELECT 指令至少要返回一行。
removeAbandoned:是否自我中断, 默认是 false。
removeAbandonedTimeout:几秒后会自我中断, removeAbandoned 必须为 true。
logAbandoned:是否记录中断事件, 默认为 false。
Poolman连接池前几年应用较广泛,现在应用相对较少。配置步骤主要是先在/项目名称/web-Inf/下加入一个jar包,然后配置一个xml文件,文件属性类似于DBCP,最后在程序中写出调用该连接池的方法。
C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现JDBC3.0和JDBC2.0扩展规范说明的Connection 和Statement 池的DataSource 对象。
自从hibernate自带了c3p0以后,c3p0很快就受到了广大程序员的认可,其性能上来说比DBCP要好的多。
有些程序员喜欢自己写连接池,建议不用这样的方法,因为连接池的管理较为复杂,自己写常出现各种各样的错误,推荐使用有成熟技术的连接池,同时也方便系统的移植。
数据库,顾名思义,是存入数据的仓库。只不过这个仓库是在计算机存储设备上的,而且数据是按一定格式存放的。
当人们收集了大量的数据后,应该把它们保存起来进入近一步的处理,进一步的抽取有用的信息。当年人们把数据存放在文件柜中,可现在随着社会的发展,数据量急剧增长,现在人们就借助计算机和数据库技术科学的保存大量的数据,以便能更好的利用这些数据资源。
要是下定义的话,就应该是:指长期储存在计算机内的、有组织的、可共享的数据集合。
数据库包含关系数据库、面向对象数据库及新兴的XML数据库等多种,目前应用最广泛的是关系数据库,若在关系数据库基础上提供部分面向对象数据库功能的对象关系数据库。在数据库技术的早期还曾经流行过层次数据库与网状数据库,但这两类数据库目前已经极少使用。
建立“缓冲存储池”,是数据库连接池的基本设计思想。这种技术类似于CPU 中的Cache 技术,将预先设定好的数据库连接放入该缓冲池中,当要建立数据库连接操作时,便从池中取出一个连接,使用完毕后再将其放回。这样就达到了连接复用的目的,应用程序重复使用一个数据库连接,在多层结构的应用程序中通过连接池技术可以使系统的性能明显得到提到。最为关键的是,该方法避免了对数据库连接的频繁建立、关闭,减小了系统开销,提高了响应速度。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据。数据库连接池属于应用程序对底层的调用,用户并发访问应用程序时会提交访问请求,然后通过线程来处理这些请求,并向连接池申请一个对数据库操作的连接,操作完毕后将连接释放。
基于以上原理,连接池的建立会在后面章节中做具体描述。为了方便理解,连接池以JSP页面形式将最大连接数的设置、连接池的使用、超时等待、连接池的关闭等情况展示出来,给用户一个更为直观的感受。
未完待续...