简介
第 4 章,“互用性技术:点对点”,描述了实现点对点互用性技术,如 .NET 远程处理和 Web 服务。这一章讲述的技术可以帮助您在 .NET Framework 和 Java 应用程序的数据层(如数据库连接和通过消息队列异步连接)之间实现连接。
一个互用性场景是您有一个现有的数据仓库,您现在要从 .NET Framework 和 Java 应用程序中访问它。结合创建共享数据库的最佳实践建议,本章考虑如此一个设置的含义。
.NET 远程处理和 Web 服务在 intranet 上或者跨越 Internet 提供链接紧耦合或松耦合系统的能力。然而,这些技术无法处理必须经受很长的滞后时间或者非永久连接环境,例如,越来越多地使用通过某种形式的无线链路进行连接的手持设备。异步方法可以克服非永久链接的问题。
通过共享数据库链接
您可能遇到过这样的情况,有两个应用程序在不同的平台,而您要使它们共享同一个基础数据库。这种配置解决了要维护多个数据存储区的问题。在 .NET Framework 和 J2EE 应用程序间共享一个数据库是在这两个环境间实现互用性的一个简单而有效的方法。
图 5.1:.NET Framework 和 J2EE 应用程序共享一个公共数据库
使您能这样做的技术并不是新的。自从这两个平台问世以来,它们就都有各自的数据库连接实现的机制。数据库驱动程序的存在使您可轻松地将业务层应用程序链接到一个公共的后端存储区,及在两个平台间共享表、记录和字段。
这两个平台都可提供到多个数据库的链接,如 Microsoft SQL Server、Oracle、Informix、MySQL 和 DB2。这一节讨论 .NET Framework 和 Java 应用程序同时连接数据库的方法和一些共享数据库的最佳实践。
在您了解如何共享数据库之前,您必须清楚每个平台如何连接到数据库。每个平台都有一个内置的数据访问 API:
• .NET Framework 中的 ADO.NET。
• Java 中的 JDBC。
对大多数实现来说,您选择的数据库和平台不应该是一个要考虑的因素。
注 虽然在本节中的示例参考的是 SQL Server 2000,但是这里说明的这些策略可以应用于所有的数据库。
用 JDBC 连接
JDBC 是允许 J2EE 应用程序访问任何兼容数据库中的表、记录、字段和存储过程的 API。您可以用 JDBC 连接几乎所有的表格数据,包括电子表格和平面文件格式中的信息。
JDBC 3.0 是该规范的最新的版本,现在有许多供应商承认,包括 IBM、Hewlett-packard、BEA、Simba 和 Oracle。Sun 最近提出了 JSR221,这包含了 JDBC 4.0 API 的规范。
注 Java 2 Platform, Standard Edition (J2SE) 1.4 在软件包 Java.sql 和 Javax.sql 包含了对 JDBC 3.0 完整的支持。这些软件包中的类和接口允许 Java 应用程序访问任何它们拥有 JDBC 数据库驱动程序的数据库。
有四种类型的 JDBC 数据库驱动程序:
• 类型 1(JDBC 到使用 ODBC 驱动程序的 ODBC bridge))第一种类型的驱动程序通过 ODBC 驱动程序提供对 JDBC 的访问。Sun 在 J2SE 中提供了一个 JDBC-ODBC 桥接驱动程序驱动程序,如果没有其他的驱动程序可用,您可以使用它。第 1 种类型的驱动程序要求在客户端计算机上安装本机代码。
• 类型 2(带有 Java 技术驱动程序的本机 API)第 2 种类型的驱动程序将 JDBC 调用转换为对客户端 API 的调用。就像第 1 种类型的驱动程序一样,这种实现也要求在客户端计算机上安装本机代码。
• 类型 3(用于数据库中间件的纯 Java 驱动程序)第 3 种类型的驱动程序将 JDBC 调用转换为中间件供应商的协议。中间件然后将此协议转换为 DBMS 调用。您不必在客户端计算机上安装任何本机代码,但是您必须为 Internet 操作指定安全配置设置。
• 类型 4(直接到数据库的纯 Java 驱动程序) 第 4 种类型的驱动程序直接将 JDBC 调用转换为 DBMS 调用,并且使用本机协议访问数据库。
注 类型 4“纯 Java”驱动程序是首选项,因为它们通常可提供最好的性能。
JDBC 使用了 ResultSet 的概念。一个 ResultSet 是满足 SQL 语句条件的所有行的集合。您可以用 get 方法访问 ResultSet 中的数据,它可以使您遍历当前行中的所有列。您也可以使用 ResultSet.next移动到下一行。
应用程序可以执行多个语句并且随后处理任意数量的结果集。产生 ResultSet 的语句通过结束语句、再次执行该语句或者从多个结果序列中返回下一个结果的方法自动结束。
注 ResultSet 类似于 ADO.NET 的 DataSet。然而,ResultSet 更接近于 ADO RecordSet,以前的 .NET 数据库访问 API 对象。
有关 ResultSets 的更多信息,请参阅 Java Web 站点的“JDBC Guide: Getting Started”。有关使用 JDBC 的更多信息,请参阅 Java Web 站点上的“JDBC Data Access API”。
用 JDBC 连接到 SQL Server 2000
您可以在 Java 应用程序中使用众多 JDBC 驱动程序中的任何一种访问 SQL Server 2000,这些驱动程序也许是免费的,也许是需要付费的。例如,Microsoft 提供了 Microsoft SQL Server 2000 Driver for JDBC Service Pack 1。这是第 4 种类型的 JDBC 驱动程序,它为 J2EE 应用程序提供具有高度伸缩性和可靠性的连接。此驱动程序为任何支持 Java 的 applet、应用程序或者应用程序服务器提供到 SQL Server 2000 的 JDBC 访问。
有关 Microsoft SQL Server 2000 Driver for JDBC Service Pack 1 的更多信息(包含下载信息),请访问 Microsoft Download Center。
注 当使用一个 JDBC 驱动程序连接到 SQL Server 2000 时,确保 SQL Server 上的安全设置使用 SQL Server 和 Windows 身份验证(混合模式身份验证)。同样,确保您为 sa 帐户设置一个复杂(混合大小写字母和数字)的密码。
有关使用 Microsoft JDBC 驱动程序连接 SQL Server 2000 的更多信息,请参阅 Microsoft 知识库文章 Q313100“HOW TO: Get Started with Microsoft JDBC”。
用 ADO.NET 连接
访问关系数据库中的数据始终是 Microsoft 平台的一个功能。在 .NET Framework 到来之前,ActiveX 数据对象 (ADO) API 是主要的数据库访问机制。.NET Framework 引入 ADO.NET 作为 Microsoft 平台上连接数据库的新 API。
ADO.NET 表现了抽象的设计概念,那就是您需要在 .NET Framework 内建立数据访问类。ADO.NET 允许您使用数据而不必顾及数据源、数据格式或者数据的物理位置。它包括了新的对象模型,并提出了新概念,如 DataSet 和 DataReader 类。
ADO.NET 通过淡化以数据库为中心的特性及进一步结合现代的基于 Web 服务的编程,在 ADO 的基础上进行了改进。它在分布式环境中工作得很好并且使开发人员快速和可靠地链接数据源。
ADO.NET 有几个主要的设计目标:
• 清楚的、可分解的对象模型 ADO.NET 提供了易用的对象模型,开发人员对如何控制数据源连接、命令执行和数据操作有完全的控制权。
• 断开连接的数据缓存模型 N 层编程和 XML Web 服务体系结构要求应用程序可以以断开连接、松散耦合的方式工作。ADO.NET 为应用程序或服务间封送处理数据提供全面的缓存数据模型并且随后更新原始数据源。
• 带有数据组合功能的通用数据表示 ADO.NET 给予您组合来自多个数据源和不同数据源的数据的能力。
• XML 支持 要构建可互用的应用程序和非常可靠的数据处理模型,XML 是个关键的组件。ADO.NET 通过用相关的方式或本机 XML 和 XML 交互的方法使用 .NET Framework 中的 XML 支持。
• 使用现有的 ADO 知识 虽然 ADO.NET 对象模型不同于先前的 ADO 模型,但是基本的构造是一样的。ADO.NET 对象模型由提供程序、连接和命令对象构成,这使目前的 ADO 开发人员可轻松迁移到 ADO.NET。
从一个开发人员的角度看,ADO.NET 表现了 .NET Framework 内可用于数据访问的类的具体实现。这些类存在于 .NET Framework 的 System.Data 命名空间内。
注 System.Data.dll 中的 ADO.NET 类被集成在 System.Xml.dll 中的XML 类中。因此要编译使用 System.Data 命名空间的代码,您应该在您的 Visual Studio.NET 项目中添加对 System.Data.dll 和 System.Xml.dll 的引用。
ADO.NET 引入了 DataSet 类提供的数据集的概念。您可以把数据集比喻成 JDBC 中的 ResultSet ,只不过数据集提供断开连接的数据视图。您可以使数据集脱机工作,修改它们,并且随后用已修改的数值更新数据库。
ADO.NET 也引入了类 SqlDataReader、OleDbDataReader 和 OracleDataReader 提供的数据读取器的概念。数据读取器对象从数据库中返回只读和只进的数据流。当在内存中一次只保留一行时,您可以使用此数据读取器对象改善应用程序性能和减少系统开销。
设计您的应用程序时要确定使用数据集还是数据读取器,请考虑您在应用程序中所需要的功能级别。
以下情况使用数据集:
• 在结果的多个离散表之间进行导航。
• 操作来自多个数据源(例如,来自多个数据库、一个 XML 文件和一个电子表格的混合数据)的数据。
• 在各层之间交换数据或使用 XML Web 服务。与数据读取器不同,您可以将一个数据集传递到远程客户端。