IBM InfoSphere Federation Server V9.7 中 JDBC 包装器的应用
2010-03-11 00:00:00 来源:WEB开发网联邦数据库的基本概念
联邦数据库是一个特殊的分布式数据管理系统,它是由一组数据源组成,其中由一个 DB2 数据库担当联邦服务器,对其他的数据源的操作都可以看作是在服务器上进行,并且这些通过联邦系统对其他数据源的操作不会影响这些数据源各自的独立性和完整性。
联邦数据库具有以下特点:
透明性:底层的多个数据源对用户而言是透明的,所有的对这些数据源的操作都像是在一个 DB2 数据库中进行的。
异构性:可以满足企业环境下不同的数据以及数据源需求。
扩展性:联邦数据库提供了一些接口,可以通过实现这些接口灵活无缝的添加新的数据源,并且联邦数据库还可以支持非关系型的数据源。
高性能:联邦数据库会对执行的操作进行优化,使用联邦系统的应用不需要实现一些特定的方法来评估查询也可以获得高的性能。
通过联邦数据库的帮助,访问多种异构数据源就变得更加简单有效。
图 1 是 DB2 联邦数据库的架构。可以看到,应用程序可以使用任何支持的接口(ODBC,JDBC,Web 服务客户端)来跟联邦服务器打交道。联邦服务器通过包装器这个模块来跟远程数据源打交道。
图 1. 联邦数据库的架构
查看原图(大图)
作为负责联邦数据库和数据源之间交互的部件,包装器在建立与不同的数据源的关系上起到重要的作用。包装器模块是一个由一类数据源访问的入口点组成的共享库。图 2 展示了在包装器模块的组成部分。
其中包装器 (Wrapper) 表示了一类远程数据源,服务器 (Server) 表示了使用包装器连接的一个特定的数据库。昵称表示了服务器中的一个特定的逻辑表。用户 (User) 提供了从最终用户到一个特定的服务器认证所需的信息,连接 (Connection) 表示了一个在联邦系统和远程数据库之间的连接。操作 (Operation) 将所有需要在远程数据库执行的操作所需的信息封装起来。
图 2. 包装器模块的组成
理解 JDBC 架构
在介绍 JDBC 包装器之前,我们先介绍一些基本的 JDBC 概念,这样我们就可以更好的理解 JDBC 包装器的工作。
JDBC 是 Java 的开发者— Sun 公司制定的 Java 数据库连接 (Java Data Base Connectivity) 技术的简称,它为 Java 程序提供了一个统一无缝地操作各种数据库的接口,程序员编程时,可以不关心它所要操作的数据库是哪个厂家的产品,从而提高了软件的通用性。
使用 JDBC 来完成对数据库的访问包括以下四个主要组件:Java 的应用程序、JDBC 驱动器管理器、驱动器和数据源,图 3 给出了 JDBC 的架构。
图 3. JDBC 的架构
由图 3 中可以看出,JDBC API 的作用就是屏蔽不同的数据库驱动程序之间的差别,使得程序设计人员有一个标准的、纯 Java 的数据库程序设计接口,为在 Java 中访问任意类型的数据库提供技术支持。驱动程序管理器(Driver Manager)为应用程序装载数据库驱动程序。数据库驱动程序是与具体的数据库相关的,用于向数据库提交 SQL 请求。
JDBC 包装器的功能
JDBC 包装器可以支持联邦数据库到多种数据源的连接。对数据源的支持与否取决于有没有这个数据源的驱动程序。由于目前主流的商业数据库以及开源数据库都提供了对 JDBC 的支持。这就使得使用 JDBC 包装器可以连接的数据库非常多。因此 JDBC 包装器可以大大扩展联邦数据库的能力。
在 V9.7 中我们实现了以下功能:
对 JDBC 4.0 的支持
包装器,服务器和昵称的创建
类型映射和基本的函数映射
对基本数据的读取
基本数据的插入、更新和删除
passthru 模式的实现
透明 DDL 的支持
在所有联邦数据库支持的平台上启动 JDBC 包装器
配置 JDBC 包装器
在联邦系统中,我们需要定义想要连接的每个数据源服务器。配置 JDBC 包装器到数据源的连接有以下几步:
驱动的安装
首先,在联邦数据库服务器中应该有要连接的数据源的驱动。每个数据源的 JDBC 驱动实现了该数据源以及客户端之间传输查询以及返回结果的协议。JDBC 驱动一般由数据库提供商或第三方提供。我们可以从它们的帮助手册查找到。
环境变量的配置
JDBC 包装器会从环境变量中读取驱动的位置,所以我们需要将 JDBC 驱动的路径添加到 CLASSPATH 环境变量中,在 MPP 模式下,需要将 JDBC 驱动添加到 db2profile 文件中的 CLASSPATH 中。对于 DB2 的 JDBC 驱动这一步可以省略,因为联邦数据库中自带了 JDBC 驱动,JDBC 包装器会从系统中自动读取。
除了在 CLASSPATH 中配置,我们还提供了一个 DRIVER_PACKAGE 服务器选项来声明驱动的位置。我们可以在向联邦数据库注册数据源的时候指定这一选项。这对于那些不具有修改环境变量权限的用户是非常有用的。
通过 URL 识别数据源
JDBC 包装器通过一个扩展的通用资源定位符(URL)来表示它连接的数据源。JDBC URL 的结构包含了以下三个部分:jdbc:<subprotocol>:<subname>
其中 JDBC 是它基于的标准,subprotocol 是特定的数据源类型,subname 是一个 subprotocol 使用的附加声明,它是基于 subprotocol 的。
Subprotocol 的值可以是 ”odbc”、”oracle” 等等,它只被 JDBC 驱动使用,JDBC 驱动连接到那个特定的 subprotocol 中去,它也被驱动管理器用来给特定的 subprotocol 匹配合适的驱动。“subname”包含了 subprotocol 用到的信息,比如数据库的位置以及端口号等等。它取决于 subprotocol 对应的 JDBC 驱动。
在我们的例子中一个到 Cloudscape 数据库的连接是 jdbc:derby:localhost:1527/testdb9
这个声明表示了使用的传输协议 (jdbc),数据库类型 (derby),数据源所在服务器的名字(localhost),端口号(1527)以及想要连接的数据库。我们也可以用 uri 来表示本地数据库,比如一个本地的 DB2 数据库 testdb,我们就可以表示成 jdbc:DB2:testdb。
在下一部分,我们将会通过连接一个到 Cloudscape 数据源的实例来说明怎样使用 JDBC 包装器
使用 JDBC 包装器
创建 JDBC 包装器
JDBC 包装器用来在联邦数据库和数据源之间通信以及获取数据源的数据,它使用 JDBC 来在所有的数据源之间进行通信。联邦数据库可以通过 “create wrapper” 的声明得知 JDBC 包装器的信息,例如,在 AIX 平台上向联邦数据库注册一个名字是 jdbc_wrapper 的包装器,可以运行以下的命令:
CREATE WRAPPER jdbc_wrapper LIBRARY ‘ libdb2rcjdbc.a ’ ;
这个命令告诉联邦数据库从哪里找到 jdbc 包装器的代码。包装器库文件的名字依赖于联邦数据库所在的操作系统,例如在 linux 平台下为 ”libdb2rcjdbc.so”, 在 windows 平台下为”db2rcjdbc.dll”, 所以在创建包装器的时候应该首先参考 JDBC 包装器的库文件列表以得到正确的名字。因为 DB2 只支持在受保护模式下加载 jvm,JDBC 包装器不支持可信模式。DB2_FENCED 选项的默认值是‘ Y ’ , 这意味着对远程数据源的操作是在一个单独的进程中进行的。
创建服务器
需要连接的数据库有多个,但是只需要一个 JDBC 包装器就可以了。例如,即便有很多不同类型的数据源,像 Microsoft SQL Server、Oracle、Cloudscape,只需要有一个创建包装器的命令。为了区别每个数据源,我们使用创建服务器命令。通过与 JDBC 包装器相关联的服务器,联邦数据库可以确定数据源的实际位置。
Create server jdbc_server_cs1 type jdbc version 3.0 wrapper jdbc_wrapper1 options
(DRIVER_PACKAGE ‘ /home2/db2inst1/My_LIB/JDBC_driver/derbyclient.jar ’ ,
driver_class ‘ org.apache.derby.jdbc.ClientDriver ’ ,
url ‘ jdbc:derby://localhost:1527/testdb;create=true; ’ );
Options 语句提供了数据源的信息,JDBC 包装器可以使用这些信息来连接到该数据源。因为 JDBC 通过 URL 来识别数据源的位置,您需要将 JDBC 驱动类添加到服务器选项 “DRIVER_CLASS”,并且将到远程数据源的 JDBC 连接 URL 添加到服务器选项“URL”中。JDBC 的驱动类包含在 JDBC 驱动库文件中,在第四部分我们介绍了除了在 CLASSPATH 或者 db2profile 中添加驱动的路径,还可以通过在创建服务器的时候通过 “DRIVER_PACKAGE” 选项指定。JDBC 包装器会首先从高 CLASSPATH 中装载驱动,然后再用在 DRIVER_PACKAGE 选项中声明的值去加载。
如果使用 DRIVER_PACKAGE 选项的时候,遇到需要包含多个驱动的情况,就将它们的路径以冒号或者分号分开。路径分隔符与 java 的 ”path.seperator” 属性相一致,在 windows 平台下为分号,在 unix 等平台下为冒号。
当连接创建之后,JDBC 包装器会检查每个驱动,确定哪一个与服务器的 URL 选项提供的值匹配。第一个可以成功的建立与 URL 之间的连接的候选驱动会被使用。以下是一些 DRIVER_PACKAGE 选项的例子:
DRIVER_PACKAGE ‘ /path1/file1; /path2/file2 ’
DRIVER_PACKAGE ‘ /path1/file1: /path2/file2 ’
注意如果 JDBC 驱动的路径名字包含分号或者冒号的时候,就不能使用这种方式来声明驱动的位置,因为我们会将它作为文件分隔符。
创建用户映射
当您试图连接一个数据源的时候,联邦数据库建立了一个到数据源的连接,这个链接使用对数据源有效的用户名和密码。您必须在每个联邦数据库的用户 ID 和密码与相关的数据源的用户名和密码之间定义一个关联用户映射,给每个访问联邦数据库来发送分布式的请求的用户 ID 建立一个用户映射。
例如 :
CREATE USER MAPPING FOR userid SERVER server_name OPTIONS (REMOTE_AUTHID ‘ remote_id ’ ,
REMOTE_PASSWORD ‘ remote_password ’ )
注意,一些 JDBC 驱动支持在 JDBC URL 中声明登陆帐户信息,在这种情况下联邦数据库中的用户映射就会失效,所有的联邦数据库用户会被映射到在 URL 中声明的用户。所以我们不建议用户在 JDBC 登陆账户中声明登陆信息。
例如,您可以将 Cloudscape 的 URL 声明为如下:
‘ jdbc:derby://localhost:1610/testdb; user=usr;password=pwd ’
创建昵称
对于您想要访问的数据源上的每个表或者视图,您需要给它们各自创建一个昵称。在那之后,当您通过 JDBC 包装器查询数据源的时候,您可以直接使用这些昵称,而不需要数据源对象的名字。
例如 :
CREATE NICKNAME nickname_name FOR jdbc_server.”remote_schema”.”remote_table”
对于那些不支持模式名称或者使用默认的模式名称的数据源,您可以使用:
CREATE NICKNAME nickname_name FOR jdbc_server.”remote_table”
当您创建昵称的时候,JDBC 包装器会调用 JDBC 接口来取得数据源的编目信息。这个查询测试了使用您在“CREATE SERVER”命令中声明的信息到数据源的连接,如果这个连接不工作,您将会收到一个错误消息。
当您成功创建昵称之后,您可以像使用其他包装器的昵称一样使用它。
JDBC 包装器的类型映射
JDBC 驱动会将远程数据类型映射到 JDBC 类型,JDBC 包装器只提供了在 DB2 和 JDBC 类型之间的类型映射。 在 JDBC 数据类型和联邦数据库的数据类型之间存在两种映射:前向类型映射和反向类型映射。
前向类型映射是从 JDBC 到 DB2 的映射,当创建一个昵称的时候,就用到了前向映射。与 JDBC 类型相对应的 DB2 数据类型存储在一个全局的编目表中。
反向类型映射是从 DB2 到 JDBC 类型之间的映射,反向类型映射用于透明 DDL。
图 4. 类型映射
正向类型映射
正向类型映射用于将远程数据类型映射到 DB2 类型,JDBC 包装器通过下面的两步实现正向映射:
远程数据类型 àJDBC 类型:这个类型映射在 JDBC 驱动的 API 中声明,JDBC 包装器可以从 JDBC 驱动的 API 中直接过的相应的 JDBC 类型。
JDBC 类型 àDB2 类型:这个数据类型在 JDBC 包装器中预定义为一个数组,JDBC 包装器可以根据数据类型的信息(长度、精度、数据范围等)找到相应的 DB2 数据类型,从 JDBC 类型到 DB2 类型之间的类型映射定义如表 1。
表 1. JDBC 到 DB2 的类型映射
JDBC Type | Condition | DB2 Type |
LONGNVARCHAR | length<=16336 | VARGRAPHIC |
16337<=length<=1073741823 | DBCLOB | |
NCHAR | length<=127 | GRAPHIC |
128<=length<=16336 | VARGRAPHIC | |
16337<=length<=1073741823 | DBCLOB | |
NVARCHAR | length<=16336 | VARGRAPHIC |
16337<=length<=1073741823 | DBCLOB | |
BIT | SMALLINT | |
TINYINT | SMALLINT | |
BIGINT | BIGINT | |
LONGVARBINARY | length<= 32672 | VARCHAR FOR BIT DATA |
32673<=length<=2147483647 | BLOB | |
VARBINARY | Length<= 32672 | VARCHAR () FOR BIT DATA |
32673<=length<=2147483647 | BLOB | |
BINARY | length<=254 | CHAR () FOR BIT DATA |
255<=length<=32672 | VARCHAR () FOR BIT DATA | |
32673<=length<=2147483647 | BLOB | |
LONGVARCHAR | length<=32672 | VARCHAR |
32673<=length<=2147483647 | CLOB | |
CHAR | length<=254 | CHAR |
255<=length<=32672 | VARCHAR | |
32673<=length<=2147483647 | CLOB | |
NUMERIC | 1<=precision<=31 and 0<=scale<=31 | DECIMAL |
32<=precision<=38 and 0<=scale<=38 | DOUBLE | |
DECIMAL | 1<=precision<=31 and 0<=scale<=31 | DECIMAL |
32<=precision<=38 and 0<=scale<=38 | DOUBLE | |
INTEGER | INTEGER | |
SMALLINT | SMALLINT | |
FLOAT | FLOAT | |
REAL | REAL | |
DOUBLE | DOUBLE | |
VARCHAR | length<= 32672 | VARCHAR |
32673<=length<=2147483647 | CLOB | |
BOOLEAN | SMALLINT | |
DATE | DATE | |
TIME | TIME | |
TIMESTAMP | TIMESTAMP | |
BLOB | BLOB | |
CLOB | CLOB | |
NCLOB | DBCLOB |
注意:
(1) 以下的类型只在 JDBC4.0 中被支持:NCHAR, NVARCHAR, LONGVARCHAR, NCLOB
(2) 我们不支持这些 JDBC 类型:DATALINK, OTHER, JAVA_OBJECT, DISTINCT, STRUCT, ARRAY, REF
反向类型映射
反向类型映射用来将 DB2 的类型映射到远程数据类型,JDBC 包装器需要通过下面的两步来实现反向映射的功能:
DB2 类型 àJDBC 类型 : 这个类型映射在 JDBC 包装器的方法中声明,具体的信息如表 2:
表 2. DB2 到 JDBC 的类型映射
DB2 Type | JDBC Type |
BIGINT | BIGINT |
VARCHAR () FOR BIT DATA | VARBINARY |
CHAR () FOR BIT DATA | BINARY |
CHAR | CHAR |
GRAPHIC | NCHAR |
DECIMAL | DECIMAL |
INTEGER | INTEGER |
SMALLINT | SMALLINT |
REAL | REAL |
DOUBLE | DOUBLE |
VARCHAR | VARCHAR |
VARGRAPHIC | NVARCHAR |
DATE | DATE |
TIME | TIME |
TIMESTAMP | TIMESTAMP |
BLOB | BLOB |
CLOB | CLOB |
DBCLOB | NCLOB |
注意:
(1) 尽管类型映射在 JDBC 包装器中是硬编码的,它与 DB2 JDBC 驱动中类型映射相一致。
(2) 我们不会将一个远程的类型映射为本地的 DB2 LONG VARCHAR 或者 LONG VARGRAPHIC ,因为它们都已经在 V9.5 FP1 中不被支持。
JDBC 类型 à远程数据类型:
这个类型映射在 JDBC API DatabaseMetaData.getTypeInfo() 声明,JDBC 包装器会在这个方法的所有类型中查询,并且返回第一个关联到相同 JDBC 类型的远程数据类型。
注意:不是所有的和版本的 DB2 支持以上所有提到的数据类型,请查阅 DB2 特定平台和版本下 IBM SQL 参考来获得详细的信息。
JDBC 包装器与 ODBC 包装器的比较
对于一些数据源,联邦数据库提供了三种类型的包装器来访问他们:ODBC 包装器,JDBC 包装器以及这个数据源专门的包装器比如 oracle 包装器,所有这些包装器都可以让您访问到数据源中的数据,但是每个包装器具有不同的能力。我们将会展示这些访问数据的方法中的一些不同,并且提供一些有用的信息来帮助您确定对于特定的需求应该选择哪种包装器。
一般而言,对那些具有专有包装器的数据源,最好使用专用封装器;对于不具有专用封装器的数据源,ODBC 包装器或者 JDBC 包装器提供了访问它们的一些可能。
与 ODBC 包装器相比较,JDBC 包装器提供了另外一种连接到普通数据源的方式。而且它可以在 ODBC 包装器之外的场景中工作。特别是当数据源提供商没有提供 ODBC 驱动的时候,或者是 ODBC 驱动在联邦数据库所在的平台不被支持的时候。并且,如果只有 ODBC 包装器而 JDBC 驱动没有被提供,我们可以使用 JDBC_ODBC 桥的方式来连接数据源。
表 3. JDBC 包装器与 ODBC 包装器的比较
JDBC 包装器 | ODBC 包装器 | ||
操作系统 | JDBC 包装器可以在联邦数据库支持的所有平台工作。 | 取决于 ODBC 驱动支持的平台 | |
配置需求 | 驱动配置 | (1)下载驱动程序文件到一个特定的目录 (2)将驱动的路径添加到 CLASSPATH 中或者在向联邦系统注册数据源的时候在服务器选项 DRIVER_PACKAGE 里面声明 | 联邦服务器上需要安装 ODBC 以及配置特定数据源的 ODBC 驱动 |
数据源的标识 | 通过 URL 来识别,具有平台无关性 | 通过结点名字以及数据库名称来识别 结点的配置取决于平台,在 windows 系统上,ODBC 数据源的节点名字必须在系统 DSN 中定义;在 linux,unix 等平台,节点名字需要在 odbc.ini 中配置 | |
支持的数据类型 | 当您使用 JDBC 包装器的时候,数据类型取决于 JDBC 驱动,JDBC 驱动将远端数据源的数据类型映射到 JDBC 数据类型。接着 JDBC 包装器映射 JDBC 数据类型到 DB2 数据类型 (1) 类型映射以及数据格式转换中的限制 a) 不支持的 JDBC 类型 : ARRAY, DATALINK, DISTINCT, JAVA_OBJECT, REF, STRUCT and OTHER b) 对于特定数据源类型的有限的支持 : i. XML 类型:当相关的 JDBC 类型是 CLOB 或者 SQLXML(JDBC4.0)的时候,将其处理为 CLOB 类型。 ii. DBCS/UNICODE 数据类型 ( 例如 DB2 GRAPHIC VARGRAPHIC DBCLOB ): JDBC 包装器将它处理为普通的数据类型。 iii. 与 JDBC 的相关类型相比,一些类型,比如 DB2 中的 DECFLOAT 以及 oracle 中 NUMBER,它们的范围可能会比较大,格式也会不同,但是 JDBC 包装器可能不会精确的映射这些类型。 | 当您使用 ODBC 包装器的时候,数据类型取决于数据源的 ODBC 驱动。 以下的这些数据类型被 DB2 的 JDBC 驱动支持,但是 DB2 的 ODBC 驱动不支持 BIGINT 8 字节整型数 BLOB 大二进制对象(BLOB)是一个长度最大为 2G 的变长的字符串,BLOB 主要用来保存二进制数据。 CLOB CLOB 是一个最大为 2G 的变长的字符串,CLOB 用来存储大的单字节字符集数据。 DBCLOB 双字节字符大对象(DBCLOB)是一个最大为 2G(1,073,741,823 个双字节字符)的变长的双字节字符串。DBCLOB 一般作为一个图形信息串,用来存储大的双字节字符集数据。 | |
插入、更新以及删除的限制 | JDBC 包装器不支持对那些限制了每个 Connection 中的活跃的操作数量的数据源进行插入、更新或者删除操作。所以应该先咨询所连接数据源的文档来确定数据源是否限制了每个 Connection 中的活跃的操作的数量。 对于那些不支持在部分更新以及删除操作以及一些 searched 更新以及删除的数据源,如果昵称或者它相对应的远程表中不存在在非空列上的唯一索引,在昵称上进行的操作将会失败。并且返回一个 reason code 是 21 的 SQL30090 错误。 | 同 JDBC 包装器 | |
依赖的标准 | JDBC 4.0 | ODBC 3.x | |
性能 | 当一些特定的服务器选项启用的时候,性能会变得快一些。但总体而言,JDBC 包装器的性能会比 ODBC 性能稍微差一点。 | 当一些特定的服务器选项启用的时候,性能会变得快一点。 | |
可靠性 | (1) 平台无关 (2) "JDBC_LOG"服务器选项用来追踪异常,它的默认值是“NO”。如果您设置这个选项为“YES”,JDBC 包装器会将 jdbc 的日志写到文件 jdbc_wrapper_<pid>.log 中,这个文件存放在 DB2 数据管理配置参数 DIAGPATH 声明的目录下(在 Unix 下它的默认值是 inst_home/sqllib/DB2dump)。这个日志是当 JDBC 包装器调用 jdbc API 的时候由 JDBC 驱动生成,它对于确定问题的所在非常有用,但是它也会降低性能,所以在世纪的场景中不推荐设置这个选项。 | (1) 依赖于平台 (2)ODBC 需要将认证的信息存储在计算机的配置文件中,所以它的安全性可能会小一点。 | |
限制 : | (1) JDBC 包装器只支持受保护模式 (2) JDBC 包装器不支持以下操作 : a) 在昵称上的 LOCK TABLE 操作 b) 操作级别的隔离 c) Passthru 中的 LOB (3) 只支持有限的方法映射以及服务器选项 (4) 只支持有限的异常映射。 如果表中包含使用特定驱动的 SQL 数据类型的列,JDBC 包装器不支持在这些表中进行 CREATE NICKNAME 以及在 pass-through 模式下 SELECT 操作。JDBC 包装器仅支持 JDBC 标准定义的 SQL 数据类型。 | (1)ODBC 包装器不支持以下的功能和操作 : a) 在昵称上进行 LOCK TABLE 操作 b) ODBC 3.x 弃用的特性 c) X/Open 或者 SQL/CLI 驱动 d) 存储过程的昵称 e) 使用保留点来增强操作级别的原子性 f) WITH HOLD 游标 如果表中包含使用特定驱动的 SQL 数据类型的列,JDBC 包装器不支持在这些表中进行 CREATE NICKNAME 以及在 pass-through 模式下 SELECT 操作。ODBC 包装器仅支持 ODBC 标准定义的 SQL 数据类型 | |
下一步工作 | l F2PC l FSTP l LOB IUD l Cursor with Hold l Save Point l 对于 C++ 和 java 代码进行性能优化 l 支持批量更新 t l ODBC 包装器中有一个的性能优化工具 DB2fedsvrcfg,可以用来查询对一些服务器选项的支持。下一步的工作中会将这个工具扩展到 JDBC 包装器中使用。 l 定制一些常用的数据源比如 mysql,IICF and U2 ( UniVerse, UniData) 等,增加数据源特定的错误码和 sqlstate 映射,以及它们支持的类型映射、方法映射和服务器选项 . | N/A |
性能优化
如果您的联邦系统用 JDBC 包装器来访问一个数据源,那么您可能需要考虑通过控制服务器选项来下推关系数据源的某些 SQL 操作来对性能进行优化。这些服务器选项用于告诉 JDBC 包装器远程数据源的某种功能或限制。
例如,有些服务器选项可以表明一个远程数据源是否支持某种特定的 SQL 特性,如外连接或嵌套表表达式,还有些服务器选项可以表达某种限制,如远程数据源所能接受的 SQL 语句的最大长度。
为什么要了解这些服务器选项?因为,如果不能下推某些操作,如关系运算符、系统函数或用户函数或 SQL 运算符,可能显著地影响查询性能。例如,让 GROUP BY 运算符在本地聚集远程数据也会要求 DB2 从远程数据源检索整个表,然后在本地进行分类。因此,有哪些服务器选项需要手动设置?在何种场合中应用?它们如何提高性能?下面我们将要做详细的阐述。
我们先来介绍几个重要的服务器选项。
PUSHDOWN
指定联合服务器是否允许数据源对操作进行下推。有效值为 Y 和 N,对于 JDBC/ODBC 数据源之外的所有关系数据源,默认的设置是 'Y'。N 指定联邦服务器向远端数据源仅发送包含带有列名的 SELECT 语句的 SQL 语句。在联邦服务器发送至数据源的任何 SQL 中不包括谓词(如 WHERE=)、列和标量函数(如 MAX 和 MIN)、排序(如 ORDER BY 或 GROUP BY)以及连接。JDBC 包装器默认认为数据源不能够处理很多复杂 SQL 或者表达式等操作。如果远端数据源可以处理谓词之类的基本操作,那么建议将该选项设为 'Y'。
VARCHAR_NO_TRAILING_BLANKS
VARCHAR_NO_TRAILING_BLANKS 选项来标识不包含结尾空白的昵称。有效值为 Y 和 N,缺省值为 N。查询编译器在检查字符比较操作时使用该信息,以决定如何执行操作。DB2 使用以空白填充的比较语义——也就是说,当比较长度不相等的字符串时,较短字符串的副本在右边被填上空白,使其长度与较长字符串的长度相同。这意味着字符串“A”被认为等同于 DB2 中的“A ”。
然而,这种行为并不适用于所有数据源上的所有字符数据类型。例如,Microsoft SQL Server 中的 VARCHAR 数据类型就不具备这样的行为。通常,不具备空白填充比较语义的字符串列上的比较需要在本地计算,除非查询编译器能够发现在远程强制类似逻辑的函数。基本前提是,无论在何处计算查询的任何部分,查询结果都应该一致。
为了补偿空白填充比较语义的差异,对于谓词之类的一些操作,联邦系统重新编写谓词,以确保当这些谓词被送到 Microsoft SQL Server 时具有相同的语义。DISTINCT、ORDER BY、GROUP BY、UNION、列函数(MIN()/MAX())计算、关系比较以及 IN 谓词之类操作的性能可能受到影响。通过设置 VARCHAR_NO_TRAILING_BLANKS 列选项通常可以提高性能,因为它允许下推更多的操作,以及对远程 SQL 语句的更多优化,以鼓励索引访问。
如果您确信来自这个远端数据库的所有 VARCHAR 列都没有结尾空白,那么也可以将 VARCHAR_NO_TRAILING BLANKS 作为一个服务器选项来设置。
COLLATING_SEQUENCE
该选项指定数据源是否与联合数据库使用相同的缺省整理顺序。有效值为 Y、N 和 I。I 指定不区分大小写。缺省值为 Y。对联合服务器指定的整理顺序必须与远程数据源上的整理顺序相匹配。
还有哪些服务器的选项可以影响下推的结果呢?我们可以借助于 ODBC 包装器中的性能优化工具 DB2fedsvrcfg 来了解更多的一些服务器选项,下面的例子是测试 MySQL 和 PostgreSQL 数据源。
下面是该工具对于两个数据源运行的结果:
MySQL
-- Generating ALTER SERVER statement...
-- --------------------------------------------------
-- ALTER SERVER statements for server "ODBC_MySQL"
-- --------------------------------------------------
ALTER SERVER "ODBC_MySQL" OPTIONS (ADD PUSHDOWN 'Y');
ALTER SERVER "ODBC_POST" OPTIONS (ADD DB2_VARCHAR_BLANKPADDED_COMPARISON 'Y');
ALTER SERVER "ODBC_MySQL" OPTIONS (ADD DB2_CHAR_BLANKPADDED_COMPARISON 'Y');
ALTER SERVER "ODBC_MySQL" OPTIONS (ADD DB2_COLFUNC_EXPR 'Y');
ALTER SERVER "ODBC_MySQL" OPTIONS (ADD DB2_FUNCTION_IN_COUNT 'Y');
ALTER SERVER "ODBC_MySQL" OPTIONS (ADD DB2_COUNT_NON_DISTINCT 'Y');
ALTER SERVER "ODBC_MySQL" OPTIONS (ADD DB2_MAX_SEL_SIZE '32677');
ALTER SERVER" ODBC_MySQL" OPTIONS (ADD DB2_MAX_OB_SIZE '17184');
ALTER SERVER "ODBC_MySQL" OPTIONS (ADD DB2_MAX_GB_SIZE '17184');
ALTER SERVER "ODBC_MySQL" OPTIONS (ADD DB2_OUTER_JOINS 'Y');
ALTER SERVER "ODBC_MySQL" OPTIONS (ADD DB2_NESTED_TAB_EXPR 'Y');
ALTER SERVER "ODBC_MySQL" OPTIONS (ADD DB2_UPD_SET_DEFAULT 'Y');
PostgreSQL
-- Generating ALTER SERVER statement...
-- --------------------------------------------------
-- ALTER SERVER statements for server "ODBC_POST"
-- --------------------------------------------------
ALTER SERVER "ODBC_POST" OPTIONS (ADD PUSHDOWN 'Y');
ALTER SERVER "ODBC_POST" OPTIONS (ADD DB2_VARCHAR_BLANKPADDED_COMPARISON 'N');
ALTER SERVER "ODBC_POST" OPTIONS (ADD DB2_CHAR_BLANKPADDED_COMPARISON 'Y');
ALTER SERVER "ODBC_POST" OPTIONS (ADD DB2_COLFUNC_EXPR 'Y');
ALTER SERVER "ODBC_POST" OPTIONS (ADD DB2_FUNCTION_IN_COUNT 'Y');
ALTER SERVER "ODBC_POST" OPTIONS (ADD DB2_COUNT_NON_DISTINCT 'Y');
ALTER SERVER "ODBC_POST" OPTIONS (ADD DB2_MAX_SEL_SIZE '32677');
ALTER SERVER "ODBC_POST" OPTIONS (ADD DB2_MAX_OB_SIZE '32677');
ALTER SERVER "ODBC_POST" OPTIONS (ADD DB2_MAX_GB_SIZE '32677');
ALTER SERVER "ODBC_POST" OPTIONS (ADD DB2_OUTER_JOINS 'Y');
ALTER SERVER "ODBC_POST" OPTIONS (ADD DB2_NESTED_TAB_EXPR 'Y');
ALTER SERVER "ODBC_POST" OPTIONS (ADD DB2_UPD_SET_DEFAULT 'N');
通过表 4 比较可以得知,针对不同的数据源以及它们能够支持 SQL 表达式的能力,每个服务器选项的值会不同。因此,在使用 JDBC 包装器时,如果能按照远端服务器支持的能力来修改设置这些属性,会提高联邦数据库访问的性能。
表 4. MySQL 与 PostgresSQL 的服务器选项比较
服务器选项 | MySQL 值 | PostgreSQL 值 |
PUSHDOWN | Y | Y |
DB2_VARCHAR_BLANKPADDED_COMPARISON | Y | N |
DB2_CHAR_BLANKPADDED_COMPARISON | Y | Y |
DB2_COLFUNC_EXPR | Y | Y |
DB2_FUNCTION_IN_COUNT | Y | Y |
DB2_COUNT_NON_DISTINCT | Y | Y |
DB2_MAX_SEL_SIZE | 32677 | 32677 |
DB2_MAX_OB_SIZE | 17184 | 32677 |
DB2_MAX_GB_SIZE | 17184 | 32677 |
DB2_OUTER_JOINS | Y | Y |
DB2_NESTED_TAB_EXPR | Y | Y |
DB2_UPD_SET_DEFAULT | Y | N |
目前该工具还没有实现对 JDBC 包装器的实现,我们会在将来的版本中支持。
表格中的服务器选项的设置取决于远端数据源的下列方面,我们把它们按照分类进行介绍。
SQL 语言能力:
不同的数据源支持不同的 SQL 语言和不同级别的功能,如果远端数据源不能够支持某种 SQL 语言的能力或者只能支持一定级别的功能,那么,通常需要将与之相关的服务器选项设置成不能够下推。这样,DB2 通常会将数据源的所有数据获取后再进行该操作。下面列举了和 SQL 语言能力相关的服务器选项:
DB2_OUTER_JOINS:标识远端数据源是否支持外连接操作,有效值是'Y','L','R','F'和'N',缺省值为 N。'Y'代表支持所有外连接操作,'L'和'R'代表只能支持左或者右外连接,'F'代表只支持全外连接。默认值是'N',不支持外连接。
DB2_FUNCTION_IN_COUNT:该选项用来标识是否支持 count() 函数。有效值为 Y 和 N,缺省值为 N。
DB2_COUNT_NON_DISTINCT:该选项用来标识是否支持使用 count(expression) 表达式,而非只支持 count(distinct expression)。有效值为 Y 和 N,缺省值为 N。
DB2_NESTED_TAB_EXPR:该选项用来标识是否支持表嵌套表达式。有效值为 Y 和 N,缺省值为 N。
DB2_COLFUNC_EXPR:该选项用来标识表中的列是否支持函数表达式,有效值为 Y 和 N,缺省值为 N。例如,远端数据源支持聚合函数和标量函数,那么建议将该选项设为 'Y'。
SQL 限制:
每个数据源都有各自 SQL 的限制,例如 SQL 语句的长度的限制、对于数字类型长度和精度的限制等。尽管远端数据源 SQL 的限制可能在 DB2 中支持,由于不能将远程限制的 SQL 发送给数据源,因此对此类限制的操作只能在本地进行。例如,如下服务器选项:
DB2_MAX_SEL_SIZE:该选项用来设置最大的 SELECT 语句字节长度。缺省值为 4K。
DB2_MAX_OB_SIZE:该选项用来设置最大的 ORDER BY 语句字节长度。缺省值为 4K。
DB2_MAX_GB_SIZE:该选项用来设置最大的 GROUP BY 语句字节长度。缺省值为 4K。
DB2_UPD_SET_DEFAULT:该选项用来标识是否在 SET 语句中支持 DEFAULT 关键字。有效值为 Y 和 N,缺省值为 N。
其他的特定于服务器的限制:
由于 DB2 的语义和远端数据源的语义不同,导致相同查询语句返回不同结果,此时,DB2 的下推受限于远端数据源的限制,因此也需要设置相应服务器选项为不能下推,从而告诉 SQL 编译器在本地进行操作。例如,下面两个服务器选项属于此类限制:
DB2_VARCHAR_BLANKPADDED_COMPARISON:该选项用来标识远端数据源 VARCHAR 类型是否用空白来填补。有效值为 Y 和 N,缺省值为 N。例如,在 DB2 中,当比较长度不相等的字符串时,较短字符串的副本在右边被填上空白,使其长度与较长字符串的长度相同。而在 Microsoft SQL Server 中,较短字符串的副本会在右边被填上’ 0x0 ’。当行为不一样时,联邦服务器不会下推此类表达式到远端数据库。
DB2_CHAR_BLANKPADDED_COMPARISON:该选项用来标识远端数据源 CHAR 类型是否用空白来填补。有效值为 Y 和 N,缺省值为 N。作用同服务器选项 DB2_VARCHAR_BLANKPADDED_COMPARISON。
Tags:IBM InfoSphere Federation
编辑录入:爽爽 [复制链接] [打 印]- ››IBM WebSphere常见问题解答
- ››IBM WebSphere Studio V5相关认证资料
- ››IBM WebSphere应用服务器发展趋势
- ››IBM WebSphere Application Server诊断和调优(一...
- ››IBM WebSphere Application Server诊断和调优(二...
- ››IBM WebSphere Performance Pack服务器
- ››IBM WebSphere软件概述
- ››IBM PowerVM 实战手册,第 3 部分 : VIO server 配...
- ››IBM PowerVM 实战手册,第 2 部分 : VIO server 准...
- ››IBM p 系列服务器系统固件升级攻略
- ››IBM PowerVM 概述
- ››InfoSphere Guardium:IBM 新的数据库安全和监视软...
更多精彩
赞助商链接