相对于基于传统的Client/Server模式的数据库系统,Web数据库系统采用三层浏览器/服务器结构(即网络浏览器/Web服务器/数据库服务器结构),具有极大的优势。Web数据库系统充分发挥了DBMS高效的数据存储与管理能力,以B/S模式为平台,将客户端统一为Web浏览器,为用户提供使用简便、内容丰富的数据库服务,已经成为Internet和Intranet提供的核心服务,为Internet上的电子商务提供技术支持。Web数据库系统的关键技术是Web与数据库的连接和访问优化。
Web数据库连接技术
常见的Web数据库连接技术有:CGI技术、WebAPI技术、RAD技术和JDBC技术等。最早出现的CGI技术得到了几乎所有的Web服务器的支持,但是存在着严重的缺陷,例如运行速度慢、开发困难和可移植性差等。WebAPI的出现克服了速度问题,但是开发更加困难。各种不同的API互不兼容,使用范围极其受限。RAD技术(快速开发技术)从根本上该改变了开发困难的现状,但是它和特定的Web服务器的依赖性很强,缺乏通用性。
JDBC(Java Database Connectivity)技术的最大优势是它为所有数据库管理系统提供一种标准接口,可以为多种关系数据库提供统一访问,大致可以分为以下三个部分:
◆ JDBC API的主要特点之一是简单且容易掌握。它主要由接口组成而不是集成类,被包含在java.sql和javax.sql两个包中。这些接口由提供JDBC驱动的软件商来完成。
◆ JDBC驱动管理器的作用是在JDBC运行结构上,提供最基础的指引功能,即当一个JDBC API程序进行数据库调用时,它会选择一个正确的JDBC驱动程序进行连接。
◆ JDBC驱动的作用是当JDBC API制作的程序进行数据调用时,实际连接数据库并进行相应的处理。JDBC驱动提供JDBC API的接口类。
JSP技术
JSP技术的特点
Java Server Page(JSP)是使用Java代码动态生成HTML文档的Web页面摸板。JSP运行于服务器端组件,称为JSP容器,它将JSP转化成等价的Java Servlet。正因为如此,Servlet和JSP页面最终是相关的。JSP页面具有了Servlet的所有优点,如良好的性能和扩展性,对HTTP会话提供嵌入式支持等。同时JSP页面还具有自身的优点,如需要时自动重新编译和与Web开发工具具有更大的兼容性。
JSP容器基于每个文件的时间戳自动管理JSP页面。当对一个JSP页面的请求发出后,容器首先判断与.JSP文件对应的类的名字。
如果该类不存在或比.JSP文件的老,然后容器为一个等价的Servlet创建Java源码并编译它。如果Servlet实例并未运行,容器载入该Servlet类并创建一个实例。最后,容器发送一个线程在载入的实例中处理当前的HTTP请求。所以,一个JSP页面有三种存在形式,即JSP源码、Java源码和已编译的Java类。
JSP元素可以分为三种:伪指令、脚本元素(包含表达式、Script和声明)和动作。其中,伪指令是指示JSP容器生成什么代码的命令;在表达式和Script中可以使用9个隐含对象;行为是创建、修改或使用对象的高层JSP元素,使用严格的XML语法编码。
利用JSP实现Web与数据库的连接
Java使用JDBC技术处理数据库是一种综合、通用方式,实现与数据库的连接,执行查询和提取数据等操作。很多关系数据库管理系统都带有JDBC驱动程序。具体步骤如下:
1.完成环境设置,导入java.sql包,命令如下:
#import java.sql.*
2.载入驱动器
JDBC规范依据驱动器结构将驱动器划分为JDBC-ODBC桥、纯Java到数据库中间件和纯Java直接到数据库几种类型。在此,采用本地API与部分Java类型驱动器,显式创建一个如下的驱动器实例并用驱动器管理器注册:
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
3.连接到数据库
驱动器管理器保留已注册驱动器列表,调用其getConnection()方法得到Connection对象。其中getConnection()的参数分别是数据库服务器的IP地址、端口号、库名和登录数据库所需的账号与密码,示例如下:
Connection conn= DirverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:demo","username","password");
4.语句接口
SQL语言由从一个关系数据库中创建、表示和抽取数据的语句组成。JDBC提供的这些SQL语句的面向对象的表示用以封装其文本、执行状态和结果。这种表示称为java.sql.Statement接口。使用预编译SQL的PreparedStatement和调用存储过程的CallableStatement这两个子接口扩展了Statement的功能,示例如下:
Statement stmt=conn.createStatement();
5.获得结果集
一个结果集是表格行的排序列表,使用JDBC中的java.sql.ResultSet接口表示。结果集由Statement接口的executeQuery()方法或一些元数据方法调用产生,示例如下:
ResultSet rs=stmt.executeQuery(sql);
利用连接池优化访问效率
在本实例中,应用层使用WebLogic 6.1,数据库层采用Oracle8.1.6,客户端使用Navigate浏览器。
实例
在本实例中建立一个命名为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(); //销毁连接池
}
目前采用JSP技术构建B/S结构的Web数据库系统是比较流行的方式,同时采用数据库连接池的系统在效率和稳定性上比采用传统的其它方式的系统要好得多。数据库连接池是一种对整个系统中比较复杂的问题的一种可行的解决办法。但在实际应用中,JDBC连接只是大型Web应用系统的一小部分,数据库连接池管理程序与Web服务器、JSP引擎和RDBMS引擎的管理策略都有可能发生冲突。用户应该全面考虑系统中的各个部分,这样才能充分发挥其高效性。