了解 Oracle 數據庫 10g 的數據庫 Web 服務,及其在面向服務的體系結構中的作用。
本文相關下載:
Oracle 數據庫 10
g 數據庫 Web 服務調出實用程序
2005 年 11 月發表
正如我在 Web 服務期刊中發表的上一篇文章中所介紹的,Web 服務使您可以使用行業標准機制輕松地訪問遠程內容和應用程序功能,而不用依賴供應商的平台、位置、服務實施或數據格式。 因此,Web 服務是實現資源虛擬化(構建企業網格的關鍵要求)的主要方法。
盡管基於符合標准的中間件的面向服務的體系結構 (SOA) 在該領域獲得了廣泛的關注,但數據庫 Web 服務(通過 HTTP 和 SOAP 等標准 Web 服務機制調用數據庫操作)卻非常流行。 根據 2004 Evans Data Corporation 調查,超過三分之二的調查對象表示他們正在開發或部署數據庫 Web 服務。
Oracle 數據庫 10
g 可以在兩個 Web 服務模式下工作: 作為 Web 服務使用方(從數據庫內部調用外部 Web 服務)或 Web 服務提供方(客戶端通過 Internet/Intranet 調用數據庫操作,從而對這些操作進行“虛擬化”)。 Oracle 數據庫 10
g 同時支持這兩個模式 — 在使用方模式下,生成 Java 代理類和 PL/SQL 包裝程序,並根據給定的 Web 服務定義語言 (WSDL) 文件將相應的文件加載到數據庫中;在提供方模式下,支持在 SOA 中將 PL/SQL、Java 存儲過程、SQL 查詢和 SQL DML 發布為 Web 服務。 (有關更多詳細信息,請參見技術白皮書“Oracle 數據庫 10
g 中 Java DB、JDBC 和數據庫 Web 服務的新特性”)。
在本文中,我將從較高層面對這兩種類型的數據庫 Web 服務進行介紹,循序漸進地指導您如何運行自己的數據庫 Web 服務演示,並將闡述在 SOA 中集成數據庫 Web 服務的好處。
有關開發和部署數據庫 Web 服務的更多信息,請參見我撰寫的
使用 Java 和 Web 服務進行 Oracle 數據庫編程一書(該書即將由 ElsevIEr Digital Press 出版);您可以在此處下載“預覽”章節。 該書將包含更多數據庫 Web 服務示例。
將數據庫用作 Web 服務使用方
通過將數據庫用作 Web 服務使用方,數據庫的涵蓋范圍得以擴展(通過 SQL 查詢或批處理作業/計劃作業),其中將包括動態數據(如股票價格)、按需生成的數據(如信用卡授權)、定期更改的數據(如 IRS 表)或原有系統(通過 Web 服務包裝程序)以及任何通常可以通過 Web 服務機制(如聯機生物信息學/基因組數據庫)訪問的數據。
首先,我們了解一下如何為 Oracle 數據庫提供 Web 服務支持。
Web 服務調出實用程序。 以 OTN 中免費下載形式提供的數據庫 Web 服務調出實用程序(在 Oracle9
i 和 Oracle 10
g 版本中)通過將純 Java Web 服務客戶端程序系列加載到數據庫中,將現有數據庫轉換為 Web 服務使用方。 這是一個一次性操作。
- 將該調出實用程序解壓縮到 $Oracle_HOME 下。
- 將 dbwsclIEnt.jar 文件加載到 SYS 模式(實現共享)中,或加載到將從中調用 Web 服務客戶端的特定模式中:
% loadJava -u sys/change -r -v -f -s -grant public -genmissing
sqlj/lib/dbwsclIEnt.jar
接下來,對於要從數據庫中調用的每個 Web 服務,您將執行靜態調用(推薦)或動態調用。
靜態 Web 服務調出(編譯時)。在給定 WSDL 文件或服務 URL 的情況下,JPublisher(一個數據庫實用程序,用於生成 Java 類以在 Java 客戶端程序中表示數據庫實體)將執行三個操作:
- 生成要直接在支持 Java 和支持 Web 服務的 Oracle 數據庫中使用的相應 Java 客戶端代理
- 在 Java 代理上生成 PL/SQL 包裝程序包,以便 SQL 和 PL/SQL 能夠對外部 Web 服務調用操作
- 將所有內容加載(如果您選擇加載)到給定的數據庫模式中,前提是它具有相應的權限
您將需要為 Web 服務調出指定幾個 JPublisher 選項:
- proxywsdl — 要調用的 Web 服務的 WSDL 文件的 URL
- user — 為其生成 PL/SQL 包裝程序的數據庫模式(和口令)
- httpproxy — 用於訪問 WSDL 文件的 HTTP 代理主機和端口
- sysuser — 具有 SYSDBA 權限的數據庫模式,使 JPublisher 能夠將生成的文件加載到數據庫中。 如果不聲明該參數,則必須將生成的文件手動加載到數據庫中。
- proxyopts — 特定於 proxywsdl 的選項列表
- dir — 所有生成文件的存儲目錄
Oracle 10
g 第 2 版 JPublisher 還支持基本類型數組和 JavaBeans 等復雜類型。
讓我們看一個例子。 下面的簡短演示使用了
getQuote Web 服務(由 www.xmethods.Net 免費提供)並提供延遲 20 分鐘的股票報價;您可以使用類似的與動態數據相關的 Web 服務來運行該演示。
WSDL 位於 http://services.xmethods.Net/soap/urn:xmethods-delayed-quotes.wsdl 中。 單擊“分析 WSDL”鏈接可以獲得端點位置,Web 服務在該位置偵聽傳入的請求。 該端點位於 http://64.124.140.30:9090/soap 中;單擊“操作”鏈接可以獲得操作和方法名。
首先,確認 dbwsa.jar、JDBC 和 JPublisher/SQLJ 庫($OH/sqlj/lib/translator.jar、$OH/sqlj/lib/runtime12.jar)位於 CLASSPATH 中。
然後,運行以下 JPublisher 命令生成 Web 服務客戶端代理和 PL/SQL 包裝程序,並將它們透明地加載到數據庫的 JVM 中。 為使生成的代碼能夠在數據庫中正常運行,請確保客戶端 JDK 與 Java 運行時兼容。 (Oracle9
i 第 2 版與 JDK-1.3.x 兼容,而 Oracle 數據庫 10
g 與 JDK 1.4.x 兼容;我在本示例中使用了 Oracle 10
g 第 2 版 JPublisher。) 此外,請與您的 DBA 核對系統口令。
$ jpub -u scott/tiger -sysuser system/manager -proxywsdl=http://services.xmethods.Net/soap/urn:xmethods-delayed
-quotes.wsdl -proxyopts=tabfun -httpproxy=www-proxy.us.Oracle.com:80 -endpoint=http://64.124.140.30:9090/soap -dir=quotesquotes/src/genproxy/NetXmethodsServicesStockquoteStockQuotePortClIEnt
JPub.Javaquotes/plsql_wrapper.sqlquotes/plsql_dropper.sqlquotes/plsql_grant.sqlquotes/plsql_revoke.sqlExecuting quotes/plsql_dropper.sqlExecuting quotes/plsql_wrapper.sqlExecuting quotes/plsql_grant.sqlLoading quotes/plsql_proxy.jarSQL> select jpub_plsql_wrapper.getQuote('ORCL') as Quote from dual;QUOTE---------- 12.6
您還可以計劃批處理作業,該作業將定期調用特定的 Web 服務並存儲結果。
或者,您可以使用 UTL_DBWS 程序包在運行時動態生成代理、方法名和參數。 該程序包支持動態調用接口 (DII)(動態調用的變體),後者在運行時生成服務端點接口。 但是,從數據庫中動態調用外部 Web 服務目前不支持復雜類型,而只支持可以映射為 SQL 或 PL/SQL 內置類型的 XML 類型。
Web 服務數據源(表函數)。 您還可以通過 Oracle 數據庫表函數機制(允許將二進制結果集作為虛擬表進行處理)從單個或多個 Web 服務中查詢 SQL 函數並將其應用於結果集。 (有關完整的示例,請參閱數據庫 Web 服務示例代碼頁。)
在該示例中,JPublisher
-proxyopts=tabfun 選項為特定 Web 服務自動生成表函數包裝程序。 例如,以下演示了在 SQL*Plus 中,針對要跟蹤報價的(選自符號表中的)符號列表調用
getQuote Web 服務生成表函數,並對該表函數進行查詢。
- 首先創建符號表。
SQL> create table symbtab (quote varchar2(4));SQL> insert into symbtab values('ORCL');SQL> insert into symbtab values ('CSCO');SQL> insert into symbtab values ('QCOM');SQL> insert into symbtab values ('QQQQ');SQL> insert into symbtab values ('GOOG');SQL> insert into symbtab values ('EBAY');SQL> insert into symbtab values ('YHOO');SQL> commit
- 然後,執行以下 SQL 命令;它針對該表中的每個符號調用 Web 服務,然後查詢表函數(例如,結果集)。 理想情況下,您可能需要 Web 服務,它獲取幾個參數形式的符號並返回它們的值。
SQL> col ARG0 format a20SQL> select * from table(jpub_plsql_wrapper.to_table_getQuote
(cursor(select * from symbtab)));ARG0 RES-------------------- ----------ORCL 12.64CSCO 17.12QCOM 43.4QQQQ 38.2799GOOG 353.58EBAY 38.2YHOO 35.427 rows selected.
輸出顯示給定符號的報價。 您可以對表函數應用 SQL 運算符(MIN、MAX、AVG 等)。 還可以存儲值並計劃批處理作業,該作業定期刷新這些值,然後使用 SQL 的強大功能挖掘該表。
有關更多詳細信息,請參閱
Oracle 數據庫 JPublisher 指南中的“簡化 Web 服務調出的選項”或上面提到的我所撰寫的書籍。
將數據庫用作 Web 服務提供方
利用將數據庫轉換為 Web 服務提供方這一功能,數據庫的功能得以擴展到 Web 服務客戶端應用程序,方法是通過標准的 Web 服務機制允許執行數據庫操作和數據檢索。
例如,許多客戶將現有的數據庫資源(如 PL/SQL 存儲過程/函數和程序包、Java 存儲過程/函數、預定義的 SQL 查詢、DML 和 Oracle 高級查詢進程)重用為基於標准的 Web 服務。 換言之,該服務是使用數據庫產物實現的並在數據庫內部運行。因此,數據庫開發人員和 DBA 無需掌握 Java 或 Web 服務編程技術便可以利用它們。
為實現該目標,可以利用 JPublisher 的功能為單個或一組數據庫操作生成 Java 代理。 具體而言,可以在 Oracle 應用服務器中將 Java 代理類發布為標准 J2EE Web 服務;為容納數據庫模型,可以使用模式、參數和代碼生成選項擴展後者的集成 Web 服務匯編程序。 與在中間層上部署的任何其他基於 J2EE 的 Web 服務一樣,生成的 Web 服務端點由 Oracle 應用服務器運行時管理。
在 Web 服務上調用函數時,Java 代理使用 JDBC 在數據庫中調用相應的操作。 隨後在數據庫中執行該服務,將結果集包裝到 SOAP 消息中,然後發送回服務請求程序。
此外,JPublisher 還允許映射 Oracle 應用服務器 Web 服務框架不支持的數據庫類型,如 Ref 游標或 PL/SQL 布爾值。
有關更多詳細信息,請參閱 JPublisher 文檔、Oracle 數據庫 Java 開發人員指南和 Oracle 應用服務器 Web 服務開發人員指南。
選擇實施和包裝
某些客戶傾向於將 Web 服務框架與數據庫(Oracle 數據庫 Web 服務的當前包裝)分開,而其他客戶傾向於使用集成包裝(受 Oracle 數據庫原生支持的數據庫 Web 服務提供程序)。 每個實現各有優缺點。
首先,通過 HTTP 直接在 Oracle 數據庫中處理 WSDL 和 SOAP 請求和響應從技術上是可行的。 盡管這樣的方法可以滿足簡單 Web 服務的需要,但它無法滿足企業 Web 服務和 SOA(稍後將對其進行詳細介紹)的可伸縮性要求。
其次,Web 服務和 SOA 框架供應商正在積極地增加新規范(QOS、互操作性等)或增強現有規范。 我認為,與可以簡單上載的 Web 服務客戶端程序系列不同,Web 服務提供程序和 SOA 程序系列更復雜,並且在靈活的中間層環境(而非更穩定的 RDBMS 環境)中能夠得到更妥善地處理。
第三,包括 Oracle 在內的大多數供應商針對中間層和 RDBMS 層使用的是同一 Web 服務和 SOA 框架,因此可以在數據庫層和應用服務器層之間提供一致的 Web 服務開發或組裝、部署和管理。 下一部分將介紹此類包裝的好處。
在 SOA 中集成 Oracle 數據庫
SOA 是一個基於 Web 服務標准和規范的概念,這使得用戶可以構造客戶端應用程序,並可在其中簡單地注冊、發現並使用通過企業網格部署的服務。 我們已經了解了如何將數據庫操作公開為標准的 Web 服務,下面我們將更深入了解一番: 如何使這些服務成為企業 SOA 的一部分。
通過 Java 代理將數據庫操作公布為 Web 服務,使這些代理可以繼承 Oracle 融合中間件 SOA 框架(包括 WS 互操作性、Web 服務可靠的消息處理、WS 安全性、Web 服務管理和 BPEL 集成)的互操作性和 QOS:
- Web 服務互操作性。 注意,互操作性是實現所有 Web 服務承諾的關鍵。 WS-I 組織通過 WS-I Basic Profile 1.0 規范指定了 Web 服務框架具備“可互操作性”的含義。 與 J2EE 認證計劃相似,WS-I Basic Profile 1.0 控制對 SOAP 1.1、WSDL 1.1、HTTP 1.1、HTTP 綁定(或 HTTPS)和 XML 模式(第 1 部分和第 2 部分)的支持。 Oracle 融合中間件 SOA 框架不但符合 WS-I Basic Profile 1.0,而且還強調與其他供應商/商家規范的互操作性。
- Web 服務可靠的消息處理。 Oracle 應用服務器為基於 SOAP 的 Web 服務實現可靠的消息處理;它具有開放性,並在 Web 服務之間提供了可靠的 SOAP 消息處理。 消息最少發送一次(有保證的發送)、最多發送一次(有保證的消除重復)或只發送一次(有保證的發送並消除重復)。 Oracle 應用服務器當前實施 OASIS 標准 WS-Reliability,並且 Oracle 是 OASIS WS-ReliableExchange 組的一員,以將 WS-Reliability 與 WS-ReliableMessaging 合並,從而確保一個可互操作的行業范圍采用的可靠消息處理標准。 Oracle 數據庫 Web 服務可以在 SOA 中使用這些服務。
- WS 安全性。 WS 安全性規范通過 XML 數字簽名提供了安全的 SOAP 消息,通過 XML 加密提供機密性,並通過 Username Token 和 X509 Token 提供證書傳播。 Oracle Web 服務管理者工具使您可以使用代理和網關通過 WS 安全性保證數據庫 Web 服務的安全。
- Web 服務管理。 Oracle Web 服務管理器的獨特管理框架提供了 Web 服務訪問控制、一次性登錄、集中的安全性策略管理,Sarbanes-Oxley、Gramm-Leach-Bliley 和 HIPAA 等規范的實施 ,並監控 WS 安全性、Web 服務可靠的消息處理、記錄和審計。 這些特性通過一系列 Java 管理擴展 (JMX) 管理 Bean (Mbean) 公開。
- BPEL 集成。 BPEL 是新興的業務流程定義標准;可以將它看作是 Web 服務的工作流。 數據庫 Web 服務可以是 Oracle BPEL 流程管理器(它提供了 rpc/encoded 以及 doc/literal 消息處理)編排的復雜 Web 服務工作流流程的一部分。
結論
您已經看到,數據庫 Web 服務在企業級 SOA 中具有重要作用。 但從 Oracle DBA 和數據庫開發人員的角度而言,數據庫 Web 服務最有意義的方面是可幫助他們重用數據庫資源,同時不受 Java 或 SOAP、WSDL 以及 UDDI 編程的影響。