第四章 概述
JDBC应用程序接口为Java编程语言访问一个或多个数据源提供了一种途径。在大多数情况下,数据源是用SQL访问的关系数据库管理系统。尽管如此,支持JDBC技术的驱动程序也可以访问其他的数据源,包括遗留文件系统(legacy file systems)和面向对象的系统。JDBC应用程序接口的一个主要动机就是为应用程序可以访问广泛的数据源提供标准的应用程序接口(API)。
这一章介绍了一些JDBC应用程序接口的关键概念。除此之外,还描述了JDBC应用程序的两种运行环境,以及讨论了不同的功能角色在每个运行环境中是怎样被实现的。两层和三层逻辑结构能够在大量的物理结构上被实现。
4.1建立一个连接
JDBC应用程序接口定义了Connection接口来表示一个到潜在数据源的连接。
在典型情况下,JDBC应用程序会用两种方式中的一种来连接到目标数据源:
■ DriverManager —— 这个被充分实现的类在最初的JDBC1.0应用程序接口中介绍过,它需要应用程序装载一个特定的驱动,这一驱动使用硬编码的统一资源定位器(URL)。
■ DataSource —— 这个接口在JDBC2.0可选包应用程序接口(Optional Package API)中介绍过。与DriverManager相比它被作为首选,因为他允许潜在数据源的细节对应用程序透明。一个DataSource对象的属性被设置以后可以表示一个特定的数据源。当它的getConnection方法被调用以后,Datasource的实例将会返回一个到数据源的连接。应用程序可以通过改变Datasource对象的属性来连接到不同的数据源,而不需要改变应用程序的代码。同样的,一个DataSource可以在不改变使用它的应用程序的代码的前提下被改变。
JDBC应用程序接口还定义了DataSource接口的两个重要扩展来支持企业级的应用程序。这些扩展就是以下的两个接口:
■ ConnectionPoolDataSource —— 支持物理连接高速缓冲和重用,物理连接改善了应用程序的性能和可伸缩性。
■ XADataSource —— 提供了在分布式事务中可共享的连接。
4.2执行SQL表达式以及操作结果集
一旦一个连接被建立,那么使用这个连接的应用程序就可以用JDBC应用程序接口对目标数据源进行查询和更新。JDBC3.0应用程序接口提供了对大多数实现了的SQL99特性的支持。因为不同的厂商都在不同的级别支持这些特性,而JDBC应用程序接口则包括了DatabaseMetadata接口。应用程序能够使用此接口来确定它们使用的数据源是否支持某一特性。JDBC应用程序接口还定义了转义语法使得应用程序可以访问非标准的厂商定义的特性。转义语法的优点是可以使得JDBC应用程序能够像本地应用程序一样访问相同的特性,而同时又能够保证应用程序的可移植性。
应用程序使用Connection接口中的方法来定义事务的属性和创建Statement,PreparedStatement和CallableStatement对象。这些表达式被用来执行SQL表达式和检索结果集。ResultSet接口封装SQL的查询结果。表达式也可以被批量执行,即允许应用程序向数据源提交多条更新语句作为执行的单个单元。
JDBC应用程序接口用RowSet接口扩展了ResultSet接口,从而为列表数据提供了一个容器,而这样比标准结果集更加通用。一个Rowset对象是一个JavaBeans™组件,它可以在没有连接到数据源的情况下对它进行操作。例如,一个RowSet可以被串行化,因此也可以在网络之间被传输,这对那些想不需要JDBC驱动和数据源连接而对表格数据进行操作的小型客户端是非常有用的。RowSet的另一个特性是能够包含一个阅读器来访问任意表格形式的数据,而不仅仅是关系数据库中的数据。更进一步的,一个RowSet对象可以在当它与数据源失去连接的时候更新它的行。它可以包含一个记录器,把那些更新写回到潜在的数据源。
4.2.1 支持SQL高级数据类型
JDBC应用程序接口定义了标准的从SQL数据类型到JDBC数据类型的映射。这包括对SQL99高级数据类型的支持,诸如BLOB,CLOB,ARRAY,REF,STRUCT和DISTINCT。JDBC驱动也可以为用户定义类型(UDTs)实现一个或多个自定义类型映射。在这个映射中,用户定义类型(UDT)被映射到一个Java类中。JDBC3.0应用程序接口还添加了对外部数据管理的支持,例如一个在数据源外部的文件中的数据。
4.3两层结构模型
一个两层结构模型按功能可以被划分为客户端层和服务器层,见图4-1。
图4-1 两层结构模型
客户端层包括了应用程序和一个或多个JDBC驱动,应用程序负责对以下职责进行处理:
■ 表现层逻辑
■ 业务逻辑
■ 对多重事务和分布式事务的管理
■ 资源管理
在这个模型中,应用程序直接与JDBC驱动交互,包括建立和管理物理连接以及处理潜在的特定的数据源的细节。应用程序可以采用特殊的实现采用不标准的特性或性能调整的优点。
这个模型的一些缺点包括:
■ 伴随着基础结构和系统级的功能使得表现层逻辑和业务层逻辑不能分离。这就为使用一个好的体系结构来编写可维护性好的产品代码带来了困难。
■ 因为采用了特定的数据库实现,降低了应用程序的可移植性。而那些要求连接到多个数据库的应用程序必须知道不同厂商的数据库之间的差异。
■ 限制了可伸缩性。通常地,应用程序在结束之前将保持一个或多个到数据库的物理连接,这样就限制了它支持并发应用程序的数量。在这个模型中,性能,可伸缩性和可用性受到JDBC驱动和相应的数据源的限制。如果一个应用程序采用了多个驱动,它也可能需要知道每种驱动和数据源解决这些限制的不同方法。
4.4三层结构模型
三层模型结构为业务逻辑和基础结构引入了中间层服务器,见图4-2:
图4-2 三层结构模型
这个体系结构被设计来为企业级的应用程序提高性能,可伸缩性和可用性。三个层的功能分别为:
1、 客户端层 —— 为程序和人的交互实现表现层逻辑的一个层。Java程序,浏览器和掌上电脑(PDAs)是常见的客户端实例。客户端与中间层应用程序交互而且不需要包含任何与基础结构和数据源相关的功能。
2、 中间层服务器 —— 中间层包括:
■ 和客户端以及业务逻辑层交互的应用程序。如果该应用程序能够与数据源交互,和低级的驱动应用程序接口相比,他将更多地处理像DataSource对象和逻辑连接这些高级抽象。
■ 为广泛的应用程序提供基础的应用程序服务器。这包括管理和共享物理连接、事务管理和屏蔽不同JDBC驱动之间的差异。最后一点使得编写可移植性良好的应用程序更加简单。J2EE服务器可以实现应用程序服务器这一角色。应用程序服务器可以实现被应用程序所使用的高级抽象和直接与JDBC驱动交互。
■ JDBC驱动提供到潜在数据源的连接。每个驱动程序在它所使用的数据源所支持的特性基础上实现标准的JDBC应用程序接口。驱动层可以屏蔽标准SQL99语法和数据源所支持的本地语法之间的差异。如果数据源不是一个关系数据库管理系统,那驱动程序则使用应用程序服务器实现关系层。
3、 潜在数据源 —— 即数据驻留层。它包括关系型数据库管理系统,遗留文件系统(legacy file systems),对象型数据库管理系统,数据仓库,电子表格或者其他形式的数据。唯一的要求就是有相应的支持JDBC应用程序接口的驱动程序。
4.5在J2EE平台中的JDBC
J2EE组件,例如JavaServer™ Pages,Servlets和企业级Java Beans™(EJB™)组件,常常需要使用JDBC应用程序接口来访问关系型数据。当J2EE组件使用了JDBC应用程序接口以后,那么可以使用相应的容器来管理它们的事务和数据源。这意味着J2EE组件开发人员可以不直接使用JDBC应用程序接口的事务管理和数据源管理的工具。具体细节请参考J2EE平台规范。