首页 >> 瓶模具

数据库连接池在动态Web网页开发中的设计与实现电动辊筒

恒茂五金网 2022-06-28 21:02:33

数据库连接池在动态Web网页开发中的设计与实现

数据库连接池在动态Web网页开发中的设计与实现 2011: 摘要:动态Web网页的开发方法有多种,其中JSP与Servlet的结合为Web动态网页的实现带来良好应用前景,在易用性、效率、安全性和可移植性方面都有很好表现。在Web环境下,当有大量的用户访问数据库时,会对系统的效率带来很大的影响。为此,分析了几种数据库连接管理方法的优缺点,并讨论了采用连接池模式的设计方法和需要注意的问题。关 键 词:动态Web网页;ASP;数据库连接池;JSP

1 引言 动态Web网页的开发通常采用数据库存储信息,页面刷新导致数据库访问频繁,大大耗费系统资源。例如,在ASP中采用ADO技术访问数据库,它把ODBC API封装成比较容易使用的对象,图1即是说明从浏览器打开ASP网页,到存取Web数据库,以及最后信息被传输回浏览器的完整过程。这样在每次访问ASP网页时,都要访问数据库。假如基于数据库的Web应用只建立一次初始请求连接并共享该连接,不仅多个请求可以共享公用资源,而且还可以在不同用户请求之间保留持续数据。

2 实现连接池的意义 Servlet是一个Java类。Senrlet模块在系统启动时被加载装入Java虚拟机并创建它的一个实例。不同用户请求由同一Servlet实例的多个独立线程处理。那些要求在不同请求之间持续有效的数据既可以用Servlet的实例变量来保存,也可以保存在独立的辅助对象中。 用JDBC访问数据库首先要创建与数据库之间的连接,获得一个连接对象(Connection),由连接对象提供执行SQL语句的方法。 数据库连接池包括一个管理类(DBConnectionManager),负责提供与多个连接池对象(DBConnectionPool类)之间的接口。每一个连接池对象管理一组JDBC连接对象,每一个连接对象可以被任意数量的Servlet共享。 连接池对象类提供的功能:①从连接池获取(或创建)可用连接。②把连接返回给连接池。③在系统关闭时释放所有资源.关闭所有连接。 管理类用于管理多个连接池对象,提供的功能:①装载和注册JDBC动程序。②根据在属性文件中定义的属性创建连接池对象。③实现连接池名字与其实例之间的映射。④跟踪客户程序对连接池的引用,保证在最后一个客户程序结束时安全地关闭所有连接池。

3 类DBConnectionPool说明 该类表示指向某个数据库的连接池。数据库由JDBCURL标识。它由3部分组成:协议标识(总是jdbc);驱动程序标识(如odbc、idb、oracle等);数据库标识(其格式依赖于驱动程序)。例如,idbc:odbc:demo,即是一个指向demo数据库的JDBC URL,且访问该数据库要使用JDBC-ODBC驱动程序。 每个连接池都有一个供客户程序使用的名字及可选的用户帐号、密码、最大连接数限制。如果Web应用程序所支持的某些数据库操作可被所有用户执行,而其他一些操作应由特别许可的用户执行,则可为两类操作分别定义连接池,两个连接池使用相同的JDBC URL,但使用不同的帐号和密码。 类DBConnectionPool的建构函数需要上述所有数据作为其参数。客户程序可以使用DBConnectionPool类提供的两个方法获取可用连接。两者的共同之处在于:如连接池中存在可用连接,则直接返回,否则创建新的连接并返回。如果没有可用连接且已有连接总数等于最大限制数,第一个方法将直接返回null,而第二个方法将等待直到有可用连接为止。所有的可用连接对象均登记在名为freeConnections的向量(Vector)中。如果向量中有多于一个的连接,getConnection()总是选取第一个。同时,由于新的可用连接总是从尾部加入向量,从而使得数据库连接由于长时间闲置而被关闭的风险减低到最小程度。第一个getConnection()在返回可用连接给客户程序之前,调用了isClosed()方法验证连接仍旧有效。如果该连接被关闭或触发异常,getConnection()递归地调用自己以尝试获取另外的可用连接。 创建新连接由newConnection()方法实现。创建过程与是否已经指定数据库帐号、密码有关。 JDBC的DriverManager类提供多个getConnection()方法,这些方法要用到JDBC URL与其他一些参数.如用户帐号和密码等。DriverManager将使用指定的JDBC URL确定适合于目标数据库的驱动程序及建立连接。 getConneetion()方法需要一个以毫秒为单位的时间参数,该参数表示客户程序能够等待的最长时间。建立连接的具体操作仍旧由第一个getConnection()。该方法执行时先将startTime初始化为当前时间。在while循环中尝试获得一个连接。如果失败,则以给定的时间值为参数调用wait()。其返回可能是由于其他线程调用notify()或notifvAll(),也可能是由于预定时间已到。为找出wait()返回的真正原因,程序用当前时间减开始时间(startTime),如差值大于预定时间则返回空值,否则再次调用getConnection()。把空闲的连接登记到连接池:freeConnection(),它的参数为返回给连接池的连接对象。该对象被加入到freeConneetions向量的末尾.然后减少已使用的连接计数。调用notifvAll()是为了通知其他正在等待可用连接的线程。 许多Servlet引擎为实现安全关闭提供多种方法。数据库连接池需要知道该事件以保证所有连接能够正常关闭。DB-ConnectionManager类负责协调整个关闭过程,但关闭连接池中所有连接的任务则由DBConnectionPool类负责。release()方法供DBConnectionManager调用。该方法遍历freeConne-tions向量并关闭所有连接,然后从向量中删除这些连接。

4 类DBConnectionManager说明 该类只能创建一个实例,其他对象能够调用其静态方法(也称为类方法)获得该唯一实例的引用。该类的建构函数是私有的,这是为了避免其它对象创建该类的实例。 该类的客户程序可以调用getInstance()方法获得对该类唯一实例的引用。类的唯一实例在getInstance()方法第一次被调用期间创建,此后其引用就一直保存在静态变量in-stance中。每次调用getInstance()都增加一个DBConnection-Manager的客户程序计数。即,该计数代表引用该类唯一实例的客户程序总数,它将被用于控制连接池的关闭操作。 该类实例的初始化工作由私有方法init()完成。其中,getResourceAsStream()方法用于定位并打开外部文件。外部文件的定位方法依赖于类装载器的实现。标准的本地类装载器查找操作总是开始于类文件所在路径,也能够搜索CLASSPATH中声明的路径。db.properties是一个属性文件.它包含定义连接池的键一值对。可供定义的公用属性:①drivers以空格分隔的JDBC驱动程序类列表;②)logfile日志文件的绝对路径。 其他的属性和特定连接池相关,其属性名字前应加上连接池名字:①.url数据库的JDBc URL;②.maxconn允许建立的最大连接数,O表示没有限制;③.user用于该连接池的数据库帐号;④.password相应的密码。其中urI属性是必需的.而其他属性则是可选的。数据库帐号和密码必须合法。用于Windows平台的db.propeities文件示例H:

注意在Windows路径中的反斜杠必须输入两个,由于属性文件中的反斜杠同时也是一个转义字符。 init()方法在创建属性对象并读取dh.properties文件之后,就开始检查logfik:属性。如果属性文件中没有指定日志文件,则默认为当前目录下的DB(]onneetionManager-.10g文件。如日志文件无法使用,则向Svstem.err输出日志记录。 装载和注册所有在drivers属性中指定的JDBC驱动程序由loadl)1"ivers()方法实现。该方法先用Stringl'okenizer将drlvers属性值分割为对应于驱动程序名称的字符串.然后依次装载这些类并创建其实例,最后在DriverManager中注册该实例并把它加入到一个私有的向量drivers。向量drivers将用于关闭服务时从DriverManager取消所有JDBC驱动程序的注册。 init()方法的最后一个任务是调用私有方法createPools()创建连接池对象。createPools()方法先创建所有属性名字的枚举对象(即Enumeration对象,该对象可以想象为一个元素系列,逐次调用其nextElement()方法将顺序返回各元素),然后在其中搜索名字以“.url”结尾的属性。对于每一个符合条件的属性.先提取其连接池名字部分,进而读取所有属于该连接池的属性,最后创建连接池对象并把它保存在实例变量pools中。散列表(Hashtable类)pools实现连接池名字到连接池对象之间的映射.此处以连接池名字为键,连接池对象为值。 为便于客户程序从指定连接池获得可用连接或将连接返回给连接池,类DBConnectionManager提供了方法getCon-nection()和freeConnection()。所有这些方法都要求在参数中指定连接池名字,具体的连接获取或返回操作则调用对应的连接池对象完成。 为实现连接池的安全关闭,DBConnectionManager提供了方法release()。如上所述,所有该类的客户程序都应该调用静态方法getInstance()以获得该管理器的引用,此调用将增加客户程序计数。客户程序在关闭时调用。release()可以递减该计数。当最后一个客户程序调用release(),递减后的引用计数为0,就可以调用各个连接池的release()方法关闭所有连接了。管理类release()方法最后的任务是撤销所有JDBC驱动程序的注册。

5 Servlet使用连接池示例 Servlet API所定义的servlet生命周期类如:①创建并初始化Servlet(init()方法)。②响应客户程序的服务请求(service()方法)。③Servlet终止运行,释放所有资源(destroy()方法)。 上述关键步骤中的相关操作为:①在init(),用实例变量connMgr保存调用DBConnectionManager.getInstance()所返回的引用。②在service(),调用getConnection(),执行数据库操作.用freeConnection()将连接返回给连接池。③在destroy(),调用release()关闭所有连接,释放所有资源。

6 结语 Setvlet是用Java编写的Server端程序,它与协议和平台无关。Servlet运行于Java-enabled Web Server中。Java Servlet可以动态地扩展Server的能力,并采用请求一响应模式提供Web服务。JSP是JavaServer Page的缩写,是Sun公司出品的Web开发语言,类似于.Microsfot公司的ASP,由于其跨平台性.愈来愈受到广泛的应用。Servkt与JSP之间的交互为开发Web服务提供了优秀的解决方案。Java Servlet作为首选的服务器端数据处理技术,正在迅速取代CGI脚本。

深圳拼接屏

工业滤水器

免费征婚交友网

精华液使用方法

常开电控防火门

夹层锅

友情链接