概述
本文討論 DB2 for z/OS 存儲過程以及把它們包裝在 Web 服務中的好處。討論如何使用 IBM Data Studio Developer 創建和部署使用 Data Web Services 特性的 Web 服務。還討論如何使用 XSLT 樣式表處理把 Web 服務的 XML 響應轉換為基於 Html 的 Web 浏覽器交互。
本文是兩篇系列文章的第一篇。第 2 部分討論如何使用 DB2 for z/OS 用戶定義函數 (UDF) 把 z/OS 數據集和 UNIX® System Services (USS) 文件信息解釋成 Data Web Services 操作。
前提條件
本文假設您知道什麼是 IBM Data Web Services,熟悉使用 IBM Data Studio Developer 創建、測試和部署 IBM Data Web Services 的基本過程。
另外,如果先下載並提取 下載 中的 AccountInquiry.zip 文件中的源代碼,會對學習本文有幫助。
存儲過程簡介
存儲過程常常用來整合和集中那些原來在應用程序中實現的邏輯。需要執行多個 SQL 語句的大型或復雜的處理可以轉移到服務器端存儲過程中,從而向企業應用程序提供集中的接口。
DB2 for z/OS 支持以下存儲過程類型:
SQL 過程(外部和本機)
外部過程(用 C、COBOL、PL/I 或 Java® 等編程語言編寫)
SQL 過程是完全用 SQL 編寫的,可以通過 SQL 操作訪問 DB2 資源。不能從 SQL 過程訪問非 DB2 資源。
外部 DB2 for z/OS 存儲過程是服務器端應用程序,可以用不同的編程語言編寫,包括 COBOL。存儲過程程序可以訪問 DB2 數據和傳統的非 DB2 資源,比如 QSAM 和 VSAM 數據集、消息隊列、CICS 程序、IMS 事務和數據庫。另外,外部存儲過程程序可以以子程序形式調用現有的應用程序,從而重用現有的業務邏輯。
其他存儲過程以及使用嵌入式 SQL、.Net、ODBC 或 Java 的 DB2 客戶機應用程序可以調用存儲過程。z/OS 外部存儲過程運行時環境由 z/OS Workload Manager (WLM) 管理。
使用存儲過程的好處
自從 DB2 for z/OS 中引入存儲過程以來,存儲過程已經發展成一種成熟健壯的技術,許多組織使用它們處理大量事務性工作負載。使用存儲過程常見的原因包括:
提高遠程客戶機的網絡性能
如果客戶機/服務器應用程序發出多個遠程 SQL 語句,那麼發送語句和接收結果的網絡開銷可能相當大。存儲過程可以封裝多個 SQL 語句,有助於避免網絡往返。
保護對數據的訪問
如果存儲過程包含嵌入式靜態 SQL,客戶機只需要有執行這個存儲過程的特權。不需要訪問底層 DB2 表的特權,因此降低了風險。
簡化開發和維護
使用存儲過程有助於降低客戶機對數據庫設計的依賴性。
訪問非 DB2 數據
與在 z/OS 環境中執行的其他應用程序一樣,用 COBOL、PL/I、C++ 或 Java 編寫的外部存儲過程可以訪問非 DB2 資源。例如,客戶機應用程序可以使用 SQL 和結果集邏輯把 VSAM 或 IMS 數據讀取到全局或聲明的臨時表中,然後處理它們。
提高可用性和可重用性
外部 DB2 for z/OS 存儲過程由 z/OS Workload Manager (WLM) 管理,因此可以提供可伸縮性和可用性。存儲過程代碼集中地存儲在數據庫服務器上,這有助於代碼重用。可以通過 DB2 for z/OS 和 WLM 接口應用存儲過程更改,而不會影響服務的可用性。
封裝業務功能
常常使用外部存儲過程訪問遺留數據存儲和遺留應用程序系統。它們封裝業務邏輯和 SQL 語句,訪問非 DB2 資源,滿足安全策略的要求,通過以子程序形式調用現有模塊來重用業務邏輯,可選地把結果集返回給客戶機應用程序。本文中描述的場景主要展示這個好處。
使用 Web 服務訪問存儲過程中封裝的業務功能
封裝了業務功能的 DB2 for z/OS 存儲過程很適合在 Data Web Services 中重用。它們提供可重用的服務,以可控的方式公開現有系統的功能。例如,服務接口(SOA 中最關鍵的組件)已經存在了(盡管不是 Web 服務接口的形式),不同部門和業務線中的企業應用程序正在使用它們。底層數據的質量分析已經成功地完成了。對於現有的存儲過程,代碼已經開發完成並經過測試,它們已經成為 IT 基礎結構的一部分,能夠滿足現有服務水平協議 (SLA) 的要求。使用 Web 服務接口公開這些存儲過程,讓更多的應用程序可以使用它們。
一個現有的示例業務場景
為了說明 DB2 for z/OS 存儲過程的價值和使用方法,本文以一個現有的示例業務場景為例,它提供三個銀行應用程序:Call Center、Bank Branch 和 Internet Banking。這些應用程序使用下面的 DB2 for z/OS 存儲過程中封裝的業務功能:
ListCustomer
AccountSummary
AccountDetail
圖 1 說明每個銀行應用程序使用這些存儲過程的方法。
圖 1. 現有的 AccountInquiry 存儲過程
Call Center 和 Bank Branch 應用程序調用存儲過程 1、2 和 3,分別獲取客戶號、賬戶號和詳細的賬戶信息。Internet Banking 應用程序只調用存儲過程 2 和 3,因為客戶在進行身份驗證時會提供客戶號。
客戶端應用程序代碼調用存儲過程,把客戶名、客戶號和賬戶號鏈接起來並顯示數據。存儲過程類型和編程語言對於客戶機是透明的。
本文中的示例使用 DB2 9 for z/OS 本機 SQL 過程訪問 DB2 表中存儲的銀行信息。您可能會問,為什麼要使用存儲過程?為什麼不直接使用 SQL 查詢提供相同的信息?正如前面提到的,存儲過程有許多好處。在這個場景中,有以下好處:
SQL 存儲過程已經存在了,它們是可重用的資產。
存儲過程讓客戶機應用程序不依賴於底層數據庫設計,降低了客戶機的復雜性,把復雜的邏輯封裝在數據庫層中。
在其他場景中,由於 IT 基礎結構的復雜性,可能需要使用外部 存儲過程。例如,存儲過程可能必須與遠程後端系統通信,從 CICS 程序、IMS 數據庫和事務獲取信息;甚至必須通過 WebSphere® MQ 與非 IBM 平台通信。
下面詳細介紹這個示例業務場景使用的存儲過程的輸入和輸出接口。
ListCustomer
ListCustomer 存儲過程提供與客戶名、客戶號和生日匹配的客戶的列表(見圖 2)。
圖 2. ListCustom 輸入和輸出接口
查看原圖(大圖)
AccountSummary
AccountSummary 存儲過程獲取給定的客戶號的銀行賬戶列表(見圖 3)。
圖 3. AccountSummary 輸入和輸出接口
查看原圖(大圖)
AccountDetail
AccountDetail 存儲過程獲取給定的客戶號的詳細賬戶狀態信息(見圖 4)。
圖 4. AccountDetail 輸入和輸出接口
查看原圖(大圖)
示例業務場景與 IBM Data Web Services
本節描述一個示例 Data Web Services 運行時環境,解釋如何通過簡便的鼠標操作以 Web 服務形式公開存儲過程。僅僅作為 Data Web Services 公開存儲過程還不足以向客戶端應用程序提供在業務上下文中運行這些 Web 服務所需的邏輯。因此,本文還討論如何使用 XSLT 樣式表把部署的 AccountInquiry Data Web Service 轉換為基於 Html 的 Web 應用程序。
IBM Data Web Service 運行時環境
圖 5 說明這個示例 Data Web Service (DWS) 運行時環境。它使用:
WebSphere Application Server for z/OS Version 6.1 (WAS) 作為 J2EE 應用服務器來駐留 AccountInquiry Web 服務。IBM DWS 運行時環境(包括通用的 DWS servlet)是 AccountInquiry DWS 的固有部分。不需要執行任何其他 WAS 實現步驟。
DB2 9 for z/OS 作為數據庫服務器。
在測試 Web 服務方面,可以使用以下任何方法:
IBM Data Studio Developer(具體地說,是 Data Web Services Explorer)
DB2 for z/OS SOAP UDFs,作為驅動 Data Web Services 請求的客戶機接口
使用 Web 浏覽器的測試客戶機
可以調用 Web 服務的任何客戶機
圖 5. IBM Data Web Services (DWS) 運行時環境概況
查看原圖(大圖)
圖 5 所示的場景在 WebSphere Application Server 中以 J2EE 應用程序的形式部署一個名為 AccountInquiry 的 Data Web Services。對於 Web 服務調用,可以選用三個 Web 服務消費者應用程序之一:DB2 for z/OS SOAP UDFs、Data Web Service Test ClIEnt 和 Data Studio Web Services Explorer。在這個示例場景中,使用 DB2 for z/OS SOAP UDFs 作為 Web 服務客戶機。
下面概述圖 5 所示的 Data Web Services 運行時環境的處理流:
Web 服務客戶機發出 SOAP/HTTP 請求,要求使用 Web 服務。
WebSphere Application Server(實現 SOAP 端點)接收 SOAP 請求並把控制傳遞給 IBM Data Web Services 運行時環境。
Data Web Services 通用 Servlet 把 SOAP 操作轉換為數據庫操作,使用 JDBC 發出相應的 SQL 請求。
根據 J2EE 和 DB2 基礎結構實現,JNDI 數據源定義使用 JDBC type 2 或 JDBC type 4 連接數據庫。
XML 編碼的輸出消息返回給 Web 服務客戶機應用程序。
作為 Data Web Services 公開現有的存儲過程
用 IBM Data Studio 創建 AccountInquiry Data Web Services
IBM Data Web Service 的創建和部署完全集成在 IBM Data Studio Developer 中,因此可以通過簡便的鼠標操作開發 Web 服務。本節描述如何使用 Data Studio Developer 以 Web 服務形式公開現有的 DB2 for z/OS 存儲過程。更詳細的信息請參見 IBM Data Studio V2.1: Getting Started with Web Services on DB2 for z/iOS。
設置到 DB2 for z/OS 數據庫服務器的連接。
圖 6. 設置數據庫連接
查看原圖(大圖)
建立到數據庫服務器的連接。
圖 7. 建立數據庫連接
查看原圖(大圖)
使用 Data Source Explorer 列出希望使用的存儲過程。
圖 8. 列出存儲過程
查看原圖(大圖)
使用 Data Project Explorer -> New -> Data Development Project 創建 Data_Account_Inquiry 項目。
圖 9. 創建 Data_AccountInquiry 項目
使用 Data Project Explorer -> Web Services -> 右鍵單擊 -> New
,創建 AccountInquiry Data Web Service 項目。
圖 10. 創建 AccountInquiry DWS 項目
把要作為 SOAP 操作公開的存儲過程拖放到 AccountInquiry Data Web Service 項目中。
圖 11. 拖放存儲過程
成功地完成拖放操作之後,會在 Data Project Explorer -> Data_Account_Inquiry -> Web Services -> AccountInquiry 中看到作為 Web 服務操作列出的存儲過程。Web 服務名後面的星號 (*) 表示這個 Web 服務還沒有構建。
圖 12. DWS AccountInquiry 操作
在 AccountInquiry Web 服務項目中,雙擊 LISTCUSTOMER,顯示在 Web 服務 AccountInquiry 執行 LISTCUSTOMER 操作時將執行的存儲過程 SQL CALL 語句。可以通過雙擊 ACCOUNTDETAIL 和 ACCOUNTSUMMARY 操作顯示另兩個 Web 服務操作的 SQL CALL 語句。
圖 13. ListCustomer 操作的 SQL CALL 語句
構建 Web Application Archive (WAR) 文件
可以在 Data Studio 中執行以下操作創建 Web Application Archive 文件:
在創建 Data Web Service 之後,構建可以在 WebSphere Application Server for z/OS 上作為 J2EE 應用程序安裝的 Web Application Archive (WAR) 文件。這需要選擇 Data Project Explorer -> Data_Account_Inquiry -> Web Services -> AccountInquiry -> 右鍵單擊 -> Build and Deploy,見圖 14。
圖 14. 構建 WAR 文件
在 Deploy Web Service 屏幕上,指定 Web 服務器目標環境,指定應該在 WAR 文件創建過程中包含 Data Web Service 測試客戶機應用程序。Data Web Services 測試客戶機應用程序非常有用,它提供一個用來測試 Web 服務操作的 Web 浏覽器界面。對於數據處理程序,還可以通過 pureQuery 在 DB2 中使用靜態 SQL,這可以提高性能和安全性並簡化數據庫管理。
圖 15. 指定 WAR 文件參數
查看原圖(大圖)
單擊 Finish 創建 WAR 文件。
在 Navigator 選項卡上,選擇 Data_Account_Inquiry -> DataServerWebServices -> AccountInquiry -> Data_Account_InquiryAccountInquiry.war。然後,右鍵單擊 PropertIEs,指定 WAR 文件的位置。在 WebSphere Application Server for z/OS 中安裝應用程序時需要 WAR 文件位置信息。
圖 16. WAR 文件位置
在 WebSphere Application Server for z/OS 中安裝 Data Web Service
本文並不詳細討論如何使用 WebSphere Application Server Integrated Solution Console (ISC);只討論如何安裝 Data Web Services。關於 WebSphere Application Server for z/OS 配置和 Data Web Services 安裝的更多信息,請參考 DB2 9 for z/OS: Deploying SOA Solutions 的 7.7 章 Setting up WebSphere Application Server。
按以下步驟使用 Integrated Solution Console (ISC) 安裝 AccountInquiry Web 服務:
定義用來連接 DB2 for z/OS 數據庫服務器的 JNDI 數據源。這個示例場景使用下面的 JNDI 數據源屬性:
Provider: DB2 Universal JDBC Driver Provider
Name: DBLN
JNDI Name: jdbc/DBLN
DB2 Location Name: RDBNDBLN
DB2 TCP/IP Port: 446
JDBC Type 4
Server Name: ZNTC
在 WebSphere Application Server ISC 中執行以下操作:
選擇 Applications -> Install New Application 上傳 Data Studio 生成的 WAR 文件(見圖 16),以便作為 J2EE 應用程序安裝 Data Web Service。
選擇 Enterprise Applications -> Applications -> Start 啟動這個新的 J2EE 應用程序。
成功地啟動應用程序之後,AccountInquiry Data Web Service 就可以處理 Web 服務請求了。
測試 AccountInquiry Data Web Service
在 WebSphere Application Server 中實現 AccountInquiry DWS 之後,客戶機應用程序就可以使用這個 Web 服務了。DB2 for z/OS 和 Data Studio Developer 提供 Web 服務客戶機應用程序,可以使用它們通過 SOAP/HTTP 消費 Web 服務。
可用的客戶機應用程序包括:
DB2 for z/OS SOAP/HTTP User Defined Functions (SOAP UDFs)
Data Studio Web Services Explorer
Data Web Service Test ClIEnt
關於 DB2 for z/OS 和 Data Studio 提供的 Web 服務客戶機應用程序的更多信息,請參考 DB2 9 for z/OS: Deploying SOA Solutions。
這個示例場景使用 DB2 for z/OS SOAP UDFs 從 SQL 調用 AccountInquiry Web 服務操作。在使用 DB2 for z/OS SOAP UDFs 之前,需要在 DB2 for z/OS 中完成幾個定制步驟。關於這些定制步驟和其他 SOAP/HTTP UDF 使用場景的詳細信息,請參考 DB2 9 for z/OS: Deploying SOA Solutions 的第 8 章 “DB2 as a Web services consumer with SOAP UDFs: Scenario 3”。
ListCustomer
圖 17 給出調用 ListCustomer Data Web Service 操作的 SQL 語句。
圖 17. 通過 SOAP UDF 調用 ListCustomer Data Web Service 操作
查看原圖(大圖)
這個 SQL 語句向 DB2 SOAP UDF 程序傳遞三個輸入參數:SOAP 端點 (P1)、SOAP 操作 (P2) 和 SOAP 請求文檔 (P3)。DB2 SOAP UDF 程序使用這些輸入參數代表 SQL 客戶機發出一個 SOAP/HTTP 請求。當 SOAP/HTTP 請求處理完成時,SOAP 響應文檔作為 VARCHAR SQL 標量值返回給 SQL 客戶機,見圖 18。
圖 18. ListCustomer SOAP UDF VARCHAR 輸出
把 VARCHAR 數據(圖 18)存儲在一個 Data Studio XML 文檔中。選擇 Data Project Explorer -> Data_Account_Inquiry ->XML -> XML Documents -> ListCustomer -> 右鍵單擊 -> Source -> Format,對 SOAP XML 響應文檔進行格式化(見圖 19)。
圖 19. 格式化的 ListCustomer SOAP 響應 XML 文檔
查看原圖(大圖)
如圖 19 所示,ListCustomer DWS 返回了兩個符合條件的客戶的信息。
AccountSummary 和 AccountDetail
對 AccountSummary 和 AccountDetail DWS 操作重復剛才執行的步驟。AccountSummary 的 SQL SOAP UDF 查詢見圖 20。AccountDetail 的 SQL SOAP UDF 查詢見圖 21。
圖 20. AccountSummary SOAP UDF 查詢
查看原圖(大圖)
圖 21. AccountDetail SOAP UDF 查詢
查看原圖(大圖)
XSLT 樣式表:把 DWS 轉換為基於 Html 的 Web 應用程序
在本節中,學習如何使用 XSLT 樣式表把 AccountInquiry DWS 轉換為基於 HTML 的 Web 浏覽器應用程序,這個程序使用 Html 超鏈接提供向下鑽取功能。
背景知識
eXtensible Style Sheet Transformation (XSLT) 語言可以把一個 XML 文檔的樹轉換為不同的結果樹。在本文的示例場景中,AccountInquiry Data Web Service 響應是一個 XML 消息,可以使用 XSLT 把它轉換為 HTML 格式。這樣就可以通過 Web 浏覽器直接調用 AccountInquiry Web 服務操作,接收 Html 格式的響應。
目標運行時環境
圖 22 描述一個把 AccountInquiry Web 服務部署為 J2EE 應用程序的場景。部署包含 XML-to-HTML 輸出轉換規則,這允許用戶像一般的基於 Html 的應用程序一樣從 Web 浏覽器調用 Web 服務。
圖 22. 包含 XSLT 處理的 DWS 運行時環境
查看原圖(大圖)
處理流的主要步驟如下:
Web 服務客戶機發出一個 REST 風格的 HTTP RPC 請求,要求使用 Web 服務。
WebSphere Application Server(實現 HTTP RPC 端點)接收 HTTP GET 請求並把控制傳遞給 Data Web Services 運行時環境。
Data Web Service 通用 Servlet 把 HTTP RPC 操作轉換為數據庫操作,使用 JDBC 發出相應的 SQL 請求。
根據 J2EE 和 DB2 基礎結構實現,JNDI 數據源定義使用 JDBC type 2 或 JDBC type 4 連接數據庫。
因為使用了 XSLT 消息輸出轉換,XML 響應消息被轉換為 Html 格式,然後返回給 Web 浏覽器。
XSLT 樣式表
下載 中的源代碼包含三個 XSLT 樣式表,它們分別針對一個 AccountInquiry 操作。XSLT 使用 HTML 超鏈接 (href) 提供從 ListCustomer 到 AccountSummary 和從 AccountSummary 到 AccountDetail 的向下鑽取功能。下面給出用於 XML-to-HTML 轉換的 XSLT 樣式表、要轉換的 Web 服務 XML 響應文檔和轉換後的 Html 文檔:
ListCustomer 響應的 XML-to-Html 輸出轉換
圖 23. ListCustomer Html 轉換
查看原圖(大圖)
圖 24. ListCustomer XML 響應
查看原圖(大圖)
圖 25. ListCustomer XSLT 轉換後的 Html
查看原圖(大圖)
AccountSummary 響應的 XML-to-Html 輸出轉換
圖 26. AccountSummary Html 轉換
查看原圖(大圖)
圖 27. AccountSummary XML 響應
查看原圖(大圖)
圖 28. AccountSummary XSLT 轉換後的 Html
查看原圖(大圖)
AccountDetail 響應的 XML-to-Html 輸出轉換
圖 29. AccountDetail Html 轉換
查看原圖(大圖)
圖 30. AccountDetail XML 響應
查看原圖(大圖)
圖 31. AccountDetail XSLT 轉換後的 Html
查看原圖(大圖)
把樣式表分配給 Data Web Service 操作
現在,把每個樣式表連接到相應的 Web 服務操作,見表 1。
表 1. 把樣式表分配給 DWS 操作
Web 服務操作 樣式表文件名 ListCustomer ListCustomertoHtml.xsl AccountSummary AccountSummarytoHtml.xsl AccountDetail AccountDetailtoHtml.xsl
為了實現上面的樣式表分配,對每個 Web 服務操作執行以下步驟:
在 Data Project Explorer 中,右鍵單擊 Web 服務操作並選擇 Manage XSLT(圖 32)。
圖 32. 管理 Web 服務操作的 XSLT
在 Configure XSL 屏幕(見圖 33)上,選擇適當的文件並單擊 Finish。XSLT 文檔現在與適當的 Web 服務操作關聯起來了。
圖 33. 把樣式表與輸出消息關聯起來
查看原圖(大圖)
為了啟用 XSLT 樣式表轉換,需要重新部署 Data Web Service J2EE 應用程序。這需要按照 構建 Web Application Archive (WAR) 文件 和 在 WAS for z/OS 中安裝 Data Web Service 中的步驟在 Data Studio 中重新構建 WAR 文件和重新安裝 J2EE 應用程序。
運行基於 Html 的 Web 服務應用程序
在 WebSphere Application Server 中成功地安裝 AccountInquiry 應用程序之後,它將使用 XSLT 輸出消息轉換。Web 服務輸出消息將轉換為 Html 格式。這使 Web 浏覽器應用程序可以使用 REST 風格的 HTTP RPC 請求與 AccountInquiry Web 服務交互。
可以使用 REST 風格的 http URL 調用 ListCustomer Web 服務操作。URL 中的特殊字符必須采用 URL 編碼形式。調用返回基於 Html 的 Web 頁面,見圖 34。
圖 34. ListCustomer XSLT 轉換後的 Html Web 頁面
查看原圖(大圖)
在圖 34 所示的浏覽器窗口中,單擊客戶號 36505633552 即可顯示這位客戶的賬戶匯總信息(見圖 35)。
圖 35. AccountSummary XSLT 轉換後的 Html Web 頁面
在圖 35 所示的浏覽器窗口中,單擊賬戶號 9000000002 即可顯示這個賬戶的詳細信息(見圖 36)。
圖 36. AccountDetail XSLT 轉換後的 Html Web 頁面
結束語
通過使用 IBM Data Web Services,只需簡單的鼠標操作就能以 Web 服務的形式公開現有的 DB2 for z/OS 存儲過程。這樣,現有的 DB2 for z/OS 存儲過程就可以成為面向服務體系結構 (SOA) 中重要的可重用資產。沒有 Java 經驗的後端開發人員也能夠把現有的存儲過程轉換為 Web 服務(不需要編程)。另外,XSLT 樣式表提供了新的應用程序開發方式。XSLT 輸出消息轉換可以把 IBM Data Web Services 轉換為成熟的基於 Html 的 Web 浏覽器應用程序,不需要編寫任何應用程序代碼。
本系列的第 2 部分將討論如何使用 DB2 for z/OS 用戶定義函數把 z/OS 數據集和 USS 文件信息與 Data Web Services 操作集成起來。
本文示例源代碼或素材下載