关于中间件2

本文探讨了JDBC的工作原理及其在Web应用中的作用,并详细介绍了如何通过连接池技术优化数据库访问,提升Web应用性能。
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 3. 1 分析JDBC构造中间件的工作方式。 采用JDBC技术其工作方式为:客户端首先访问Web服务器,下载Java字节码文件,并将Applet相关类的字节码文件和JDBC接口字节码文件下栽到客户端,然后与Web服务器脱离,接着Applet根据数据库地址,端口号和帐号与数据库服务器连接进行交互,这样用户与数据库服务器的交互是由浏览器直接完成的。由于JDBC技术的可操作性、可维护性和安全性及事务处理能力、使用效率都比较高,因此具有很大的优势。 Java与数据库的连接机制与CGI和API有所不同,在客户机上运行Java Applet通过JDBC技术可以绕过Web服务器直接和数据库服务器连接,并直接把带有结果的HTML页返回客户机浏览器。 象ODBC一样,JDBC提供给程序员的编程接口是由两部分组成,一是面向应用程序的编程接口JDBC API,它是为应用程序员提供的,二是供底层开发的驱动程序接口JDBC Driver API,它是各个商业数据库厂商提供的。目前,JDBC已经得到了许多厂商的支持,包括 Borland,IBM,Oracle和Sybase等公司,当前流行的大多数数据库系统都推出了自己的JDBC驱动程序。 1.1 网上学院的中间件构造图 我们可以看到,要完成的中间件涉及到的方面太多,太广,在有限的时间和人力资源的情况下很难全部完成,分析上图,联系网上学院具体面向的对象,大多是即时访问数据库和用户登录时验证身份,获得权限,以及简单的文件上传和下载,所以影响效率的部分集中在打开和关闭数据库上,反而读取数据库对速度的影响不大,为了解决这个瓶颈问题,我决定具体来完成数据库连接池部分,在较短的时间里,是系统获得较大的改善。 l 在网上学院大量用户访问信息的时间相对集中,信息传输具有突发性,但是一旦用户建立了与相应数据库的连接,那么客户端在进行处理时,与数据库的连接通常是空闲的。如果能够充分利用这些时间,使得这些连接能够为其他用户提供服务,那么,就能大大提高同时服务的用户数。 l 动态Web站点往往用数据库存储的信息生成Web页面,每一个页面请求导致一次数据库访问。连接数据库不仅要开销一定的通讯和内存资源,还必须完成用户验证、安全上下文配置这类任务,因而往往成为最为耗时的操作。当然,实际的连接时间开销千变万化,但1到2秒延迟并非不常见。如果某个基于数据库的Web应用只需建立一次初始连接,不同页面请求能够共享同一连接,就能获得显著的性能改善。    3. 2 连接池的实现 这个连接池必须从两个方面来考虑: 3.2.1 类DBConnectionPool应该提供以下功能:       1) 从连接池获取(或创建)可用连接。    2) 把连接返回给连接池。    3) 在系统关闭时释放所有资源,关闭所有连接。       此外, DBConnectionPool类还能够处理无效连接(原来登记为可用的连接,由于某种原因不再可用,如超时,通讯问题),并能够限制连接池中的连接总数不超过某个预定值。    3.2.2 管理类DBConnectionManager用于管理多个连接池对象,它提供以下功能:       1) 装载和注册JDBC驱动程序。    2) 根据在属性文件中定义的属性创建连接池对象。    3) 实现连接池名字与其实例之间的映射。    4) 跟踪客户程序对连接池的引用,保证在最后一个客户程序结束时安全地关闭所有连接池。       Servlet是一个Java类。Servlet引擎(它可能是Web服务软件的一部分,也可能是一个独立的附加模块)在系统启动或Servlet第一次被请求时将该类装入Java虚拟机并创建它的一个实例。不同用户请求由同一Servlet实例的多个独立线程处理。那些要求在不同请求之间持续有效的数据既可以用Servlet的实例变量来保存,也可以保存在独立的辅助对象中。    用JDBC访问数据库首先要创建与数据库之间的连接,获得一个连接对象(Connection),由连接对象提供执行SQL语句的方法。本文介绍的数据库连接池包括一个管理类DBConnectionManager,负责提供与多个连接池对象(DBConnectionPool类)之间的接口。每一个连接池对象管理一组JDBC连接对象,每一个连接对象可以被任意数量的Servlet共享。 第 四 章 4. 可行性分析. 分析我要完成的连接池,发现重点还是在JDBC上,仔细分析JDBC的工作原理 JDBC API中有两个不同的层:应用程序层和驱动程序层。应用程序层是数据库应用程序开发者使用的,开发人员用API通过SQL调用数据库取得结果。驱动程序层是驱动程序厂家实现的,处理与具体驱动程序版本通讯。图演示出了应用程序层与驱动程序层的连接。 应用程序层包括4个主要接口:Connection、Statement、ResultSet和DatabaseMetaData接口。Connection接口是一个C/S连接的接口,提供了进行事务处理的方法和创建执行SQL语句、存储过程所用对象的方法。Statement接口是一个数据查询或操作的接口,支持内含SQL语句以及SQL语句的执行。ResultSet接口是SQL操作结果集的接口,支持对结果的访问。DatabaseMetaData接口提供了许多有用的函数,用于获取数据库和数据库对象的有关信息,如表的主键、行列数。JDBC功能包括两个方面: 1.1 建立与数据库的连接 应用程序调用DriverManager的静态方法getConnection(),并把URL作为参数传递给该方法。该方法用当前的Driver对象或已注册的对象表中某个合适的Driver对象连接指定的数据库,如果有Driver能处理此URL,DriverManager将用它建立1个数据库连接并返回1个Connection类型的对象。 1.2 发送SQL语句 应用程序在取得1个对数据库的连接Connection后,可以使用Connection.createStatement()方法创建Statement类型的对象或Connection.preparedStatement()创建PreparedStatement类型的对象。两者的差别在于Statement不允许在执行的SQL语句中有任何参数,PreparedStatement允许In参数。利用Statement对象或preparedStatement对象向数据库发送SQL语句执行查询,返回一个ResultSet类型的对象. 从上面分析可以看出,一个动态的网站频繁地从数据库中取得数据来构成html页面。每一次请求一个页面都会发生数据库操作。但连接数据库却是一个需要消耗大量时间的工作,因为请求连接需要建立通讯,分配资源,进行权限认证。这些工作很少能在一两秒内完成。所以,建立一个连接,然后再后续的查询中都使用此连接会大大地提高性能。因为servlet可以在不同的请求间保持状态,因此采用数据库连接池是一个直接的解决方案。 Servlet在服务器的进程空间中驻留,可以方便而持久地维护数据库连接。有一个连接池管理器管理连接池对象,其中每一个连接池保持一组数据库连接对象,这些对象可为任何servlet所使用。 4.2 关于使用者权限问题。 DBConnectionPool类代表一个由url标识的数据库连接池。前面,我们已经提到,jdbc的url由三个部分组成:协议标识(总是jdbc),子协议标识(例如,odbc.oracle),和数据库标识(跟特定的数据库有关)。连接池也具有一个名字,供客户程序引用。另外,连接池还有一个用户名,一个密码和一个最大允许连接数。如果web应用允许所有的用户使用某些数据库操作,而另一些操作是有限制的,则可以创建两个连接池,具有同样的url,不同的user name和password,分别处理两类不同的操作权限。 仔细分析这个很重要的DBConnectionPooL,发现DBConnectionPool的构造重点在几个参数上面。  构造函数取得上述的所有参数: public DBConnectionPool(String name, String URL, String user, String password, int maxConn) { this.name = name; this.URL = URL; this.user = user; this.password = password; this.maxConn = maxConn; } 将所有的参数保存在实例变量中。 4 .3 JDBC 和连接池 如图所示,当程序中需要建立数据库连接时,只须从内存中取一个来用而不用新建。同样,使用完毕后,只需放回内存即可。而连接的建立、断开都有连接池自身来管理。同时,我们还可以通过设置连接池的参数来控制连接池中的连接数、每个连接的最大使用次数等等。通过使用连接池,将大大提高程序效率,同时,我们可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。下面我们以一个名为ConnectionPool的连接池为例来看看连接池的实现。先看看ConnectionPool的基本属性:   m_ConnectionPoolSize:连接池中连接数量下限   m_ConnectionPoolMax:连接池中连接数量上限   m_ConnectionUseCount:一个连接的最大使用次数   m_ConnectionTimeout:一个连接的最长空闲时间   m_MaxConnections = -1:同一时间的最大连接数   m_timer:定时器   这些属性定义了连接池与其中的每个连接的有效状态值。连接池的自我管理,实际上就是通过定时的对每个连接的状态、连接的数量进行判断而进行相应操作。其管理流程如下: 通过上图,我们可以定义出ConnectionPool要完成管理所需要的基本接口: public class ConnectionPool implements TimerListener{   public boolean initialize() //连接池初始化   public void destroy() //连接池的销毁   public synchronized java.sql.Connection getConnection() //取一个连接   public synchronized void close() //关闭一个连接   private synchronized void removeFromPool() //把一个连接从连接池中删除   private synchronized void fillPool() //维护连接池大小   public synchronized void TimerEvent() //定时器事件处理函数 }   通过这几个接口,已经可以完成连接池的基本管理。在TimeEvent()函数中完成连接池的状态检验工作,fillPool()时连接池至少保持最小连接数。因为我们要保存每一个连接的状态,所以还需要一个数据库连接对象: class ConnectionObject{   public java.sql.Connection con; public boolean inUse; //是否被使用标志   public long lastAccess; //最近一次开始使用时间   public int useCount; //被使用次数 } 加入了ConnectionObject对象后,在ConnectionPool中操作的应该只是ConnectionObject,而其他进程需要的只是ConnectionObject的con属性,因此我们再加入一个类,作为其他进程获得与返回连接的接口: CLASS Conn{   GetConnection(); //从连接池中取出一个有效连接   CloseConnection(); //返回连接,此时并没有关闭连接,只是放回了连接池   DestroyPool(); //销毁连接池 }   最后我们的整个系统总的架构如下:          4.4 后期准备工作 第一:架够jsp和servlets 第二: 进行具体连接池的编码 第三: 在JSP上进行测试 第四: 与网上学院的数据库挂钩,进行基本性能测试
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值