【IT168 技术文档】存储过程的二进制部署:历史
在历史上,想要开发和部署 SQL 和 Java 存储过程的客户,可以通过使用 DB2 for Universal Database™ (UDB) V7 或其后继者 Development Center 中的 Stored Procedure Builder 来达到目的。这个过程需要对存储过程进行 “完全构建(full build)”,期间,在部署到数据库时,需要用到源文件。客户如果只想部署存储过程的可执行部分,可以在连接到 DB2 for Linux®, UNIX®, and Windows® V8.2 FP7 及更高版本时进行部署。但是,即使已经连接到 DB2 for z/OS,客户也只能通过手动方式来避免部署源文件。
对于 DB2 for z/OS V9 之前的版本,DB2 for z/OS SQL 存储过程(我们称之为外部 SQL 存储过程)是使用 DSNTPSMP 实用程序来部署的。源文件和构建选项,例如 pre-compile、compile、linkedit 和 bind 选项,存储在 SYSROUTINES_SRC 和 SYSROUTINES_OPTS 这两个 DB2 编目表中。DBRM 和 linkedit 输出存储在分区数据集中,这些数据集位于 DSNTPSMP 实用程序的 JCL 的 STEPLIB 中。
Development Center 提供了一个 DB2Build 实用程序,该实用程序在客户端执行,可用于将 SQL 存储过程部署到另一个目标 DB2 for z/OS 服务器上。但是这个实用程序还执行存储过程的完全构建,以便将源文件也放到目标服务器上。为了只将二进制文件部署到另一个不同的 DB2 for z/OS 目标上,客户必须完成一个手动的过程,IBM 红皮书 “Through the Call and Beyond” 的第 16 章第 3.1 节和第 29 章第 5.5 节对此作了描述。这个手动过程包括以下步骤:
将 DBRM 和编译后的 SQL 模块从源服务器复制到目标服务器(例如使用 FTP)
在目标服务器上绑定 DBRM。
根据 SCHEMA 名称、集合 ID 和 WLM 应用程序环境的变化复制和修改 SQL 存储过程 DDL。
执行修改后的 DDL,以编目 SQL 存储过程。
授予存储过程上的执行权限。
对于使用老的驱动程序(IBM DB2 JDBC/SQLJ Driver)构建的 DB2 for z/OS Java 存储过程,Development Center 调用一个 DB2 提供的存储过程 DSNTJSPP 来执行 SQLJ 存储过程的定制和绑定以及传送的服务器上的 JAR 文件的安装。在 DSNTJSPP 成功安装了 JAR 文件之后,该工具执行 CREATE PROCEDURE 来编目 Java 存储过程。这些任务都是在服务器端完成的。Development Center 中不支持使用 Java 存储过程的二进制文件进行部署。(在 Rational® Application Developer V6 的 Stored Procedure Builder 工具中提供了使用 DB2 for z/OS Java SP 的二进制进行部署的功能)。与 SQL 存储过程一样,使用 Java 存储过程的二进制文件的部署是一个手动过程。Development Center 在客户端使用 javac 执行 Java 编译,并在目标服务器的 SYSJARCONTENTS 编目中将编译后的 Java 类字节码安装为 BLOB。为了使用二进制文件进行部署,客户需要:
从源服务器的 SYSJARCONTENTS 编目表中提取出 JAR 文件。
将提取出的文件复制或通过 FTP 传送到目标服务器。
在目标服务器上执行 DB2 提供的 SQLJ_INSTALL_JAR 存储过程,以安装 jar。
将 DBRM 文件从源服务器复制到目标服务器,并绑定 DBRM。
复制和修改 Create Procedure DDL。
在目标服务器上执行该 DDL。
授予对迁移过来的 Java 存储过程的执行权限。
Developer Workbench 对二进制部署的支持
Developer Workbench (DWB) 同时支持 SQL 和 Java 存储过程的二进制部署。该工具会自动执行上一节中列出的那些步骤,从而简化二进制文件的部署。此外,DWB 还:
允许源服务器和目标服务器是 DB2 Linux、UNIX 或 Windows;DB2 for z/OS;或 Derby。
支持将 DB2 Linux、UNIX 或 Windows、DB2 for z/OS 和 Derby 存储过程部署到与源服务器具有相同操作系统的服务器的二进制部署。
支持 DB2 for z/OS 中的本地 SQL 存储过程的二进制部署。(只有当源服务器和目标服务器都是 DB2 for z/OS V9 时,才能对本地 SQL 存储过程进行二进制部署。)
不管使用源文件还是二进制文件,Developer Workbench 都通过 Deploy 向导提供了对将存储过程部署到 DB2 for z/OS V8 或 V9 的支持。该向导可以一次部署一个或多个存储过程。为了一次部署多个存储过程,可以从存储过程文件夹启动 Deploy 向导,如图 2 所示。
图 1. 从 Data Project Explorer 启动 Deploy 向导
图 2. 从 Database Explorer 启动 Deploy 向导
当从 Stored Procedure 文件夹启动向导时,可以看到之前部署过的一组存储过程。您可以选择所有的存储过程,或者只选择想要部署的存储过程(见图 3)。
图 3. Selection 列表
在选择好要部署的存储过程之后,可以看到如图 4 所示的面板。对于部署的目标服务器,Deploy 向导为用户提供了三个选择。用户可选择的目标有:
当前连接:创建项目时指定的连接。
已有的不同连接:下拉列表中显示的一系列来自 Database Explorer 的活动连接。
不同的新连接:单击 “New” 按钮可启动 DWB 的连接向导。用户可以使用该向导输入新连接的连接信息。
图 4. 部署选项
仍然是在这个面板中,Deploy 向导为用户提供了使用二进制文件进行部署时的选项(见图 4 底端)。当部署到 DB2 for z/OS V8 及以上版本时,“Target Load Library” 字段被启用。由于使用 DSNTPSMP 编译的 SQL 存储过程在库中保留了它们被编译过的代码,因此该工具需要知道,编译后的代码应该放在目标服务器上的什么地方。用户还可以通过选择 Deploy by building the source 单选按钮,“复制(copy)” 外部 SQL 存储过程。
在接下来的面板中,Deploy 向导显示了例程和部署选项,如图 5 所示。用户可以选择为使用二进制文件部署的存储过程修改这些字段。
图 5. Routine 选项
当单击 Finish 按钮时,DWB 将开始部署二进制文件。
对于 DB2 for z/OS SQL 存储过程,DWB 调用一系列 DB2 提供的存储过程来为用户执行以下任务:
创建到源服务器和目标服务器的连接。
从源服务器获得存储过程装载模块。
将装载模块写到目标服务器的装载模块库中。
在目标服务器上执行来自源服务器的 CREATE PROCEDURE DDL,以编目存储过程。
在目标服务器上,使用用户在 Deploy 向导中指定的例程和部署选项,并加上 COPY 选项执行 BIND PACKAGE。
对于 DB2 for z/OS Java 存储过程,DWB 执行与前面列出的手动过程类似的步骤。DWB 将:
从源服务器的 SYSJARCONTENTS 编目表中提取出 JAR 文件。
在部署 SQLJ 存储过程时,将 JAR 文件写到一个文件中,并执行 BIND PACKAGE COPY 在目标服务器上创建包。
使用 DB2 提供的 SQLJ_INSTALL_JAR 存储过程在目标服务器上安装 JAR 文件。
对于 SQLJ 存储过程,根据 Deploy 向导中的绑定选项,将串行化的 profile 文件绑定到目标服务器。
根据用户对 ddl 的修改,例如对模式、WLM 环境和集合 ID 的修改,生成 Create Procedure DDL。
在目标服务器上执行该 DDL。
用于二进制部署的环境设置
为了支持 DB2 for z/OS V8 和 V9 中外部 SQL 存储过程的二进制部署,必须执行以下步骤:
运行 z/OS Enablement 示例任务,启用对使用 DB2 提供的存储过程的支持。
设置使用 DB2 提供的存储过程而需要的授权。
使用和源装载库相同的 Dataset Control Block (DCB) 信息分配目标装载库。
在将要执行被迁移的存储过程的目标服务器上设置 WLM 过程,从而使得 JDK 级别与源 JDK 兼容。
确认 SYSIBM.SYSLOCATIONS 和 SYSIBM.SYSLUNAMES 中存在源服务器和目标服务器的编目条目。
为了支持 DB2 for z/OS V8 和 V9 中的 Java 存储过程的二进制部署,在连接到服务器时需要使用 IBM DB2 Universal Driver for SQLJ 和 JDBC。Java 存储过程需要使用这个驱动程序进行连接,并且在使用二进制文件部署到其他服务器之前,需要首先使用 DWB 进行部署。
z/OS Administration Enablement 存储过程
z/OS Administration Enablement 存储过程一开始是开发用来为 DB2 for LUW Control Center 提供服务器端的功能。DWB 使用这些存储过程来处理在部署外部 SQL 存储过程时,需要执行的与 JCL 相关的大部分任务。相应的活动任务在 SDSNSAMP 库的 DSNTIJCC 成员中可以找到。
此外,DB2 for z/OS V8 要求应用 PTF UK10768。
授权设置
连接源服务器和目标服务器以及执行从源服务器到目标服务器的二进制部署时所使用的用户 ID,需要拥有某些 DB2 数据库管理权限以及附加的 RACF 特权。该用户 ID 还需要一些特权来操纵被部署的存储过程中所使用到的对象。用于登录到目标服务器的用户 ID 需要目标装载库上的 RACF 授权,以及提交 JCL 和 USS 命令所需的权限。IBM 红皮书 “Through the Call and Beyond” 的第 25 章详细描述了使用 DB2 提供的存储过程所需的各种授权。这里也给出了一个示例授权任务。
目标装载库
外部 SQL 存储过程的二进制部署需要将来自源服务器的装载模块复制到目标服务器上的一个数据集中。DWB 从编目中获得源服务器的装载库信息。但是,它不能确定接收装载模块的数据集的名称,也不能确定这个数据集是否已经存在。然后,还必须以与源装载库相同的 DCB 信息来预先分配目标装载库。
Java 方面的考虑
当使用二进制文件部署 Java 存储过程时,一开始将 Java 存储过程部署到源服务器时所采用的 JDK 级别必须与目标服务器的 JDK 级别兼容。例如,如果源服务器的 JDK 级别是 1.4.2,那么建议为目标服务器使用的 JDK 级别为 1.4.2 或更高。
二进制部署的限制和条件
在使用二进制文件进行部署时,存在一些条件和限制。下面是用户可能碰到的大多数常见错误。
使用二进制文件部署之前用 DSNTJSPP 构建的 Java 存储过程
使用 DSNTJSPP 构建实用程序创建的 Java 存储过程不适合二进制部署。这是因为编译和 JAR 归档工作是在服务器端由 DSNTJSPP 实用程序来完成的。DWB 不能确定 JAR 文件的位置和类路径。
使用二进制文件部署之前用二进制部署的外部 SQL 存储过程
当最初部署外部 SQL 存储过程时,要编目源数据集和 DBRM 数据集的名称。当使用二进制文件部署这个存储过程时,这样的信息不会传送到目标服务器。因此,DWB 不能使用二进制文件重新部署这个存储过程。
将本地 SQL 存储过程部署到 DB2 for z/OS V8
这种情况下会出现一个 “function not supported” 错误消息,因为 DB2 for z/OS V8 不支持本地 SQL 存储过程。
删除一个用二进制文件部署的过程
要删除一个用二进制文件部署的过程,可以使用 DWB,或者对该过程发出一个 DROP PROCEDURE RESTRICT 命令。
EDC5139I Operation not permitted; or DSNACCJS - execution failed: __login( ) unsuccessful during binary deploy.
发出二进制部署的用户 ID 在 RACF 程序控制中没有定义。用于切换用户的 _login 函数调用失败。请确保运行了 IBM 红皮书 “Through the Call and Beyond” 中第 25 章列出的授权步骤。
IEB127I RECFM INCOMPATIBLE -- INPUT RECFM=U OUTPUT RECFM=FB
目标装载模块既不是分区数据集,也没有与源装载模块数据集相同的记录格式 U。由于该部署是在工作站上进行的,发出部署的用户可能无法获得那样的信息。
UnsupportedClassVersionException
最初将 Java 存储过程部署到源服务器时使用的 JDK 级别与目标服务器上的 JDK 级别不兼容。
分布式设置问题
在分布式环境中,需要设置源服务器和目标服务器,在它们各自的 Communication Database 编目中正确地定义源和目标 LOCATION 和 LUNAMES。此外,在这两个系统中都必须启动 DB2 的 Distributed Data Facility(DDF)。
结束语
使用二进制文件进行部署可以为客户带来一些益处,包括:
它允许在同一个环境中,通常是在开发环境中,进行开发和调试。如果使用变更管理系统,则构成存储过程的所有对象(例如源代码、DBRM、JAR 文件)都在这个环境中得到管理。
对于使用 DWB 构建的外部 SQL 存储过程,源文件放在开发环境的目录中。使用二进制文件进行部署时,不会将源代码也传送到目标服务器。因此,目标服务器上不需要有编译器,这可以看作是客户的附加成本。
使用二进制文件部署 Java 存储过程时,不需要在目标服务器上重新编译。同样, Java 源代码、DDL 和 JAR 文件也是放在开发环境中。
对于这两种类型的存储过程,被部署的二进制文件不能被部署到另一个目标上。这样可以防止被部署的存储过程在其他地方被修改和重新部署。开发环境控制着存储过程将被部署到什么地方。