[转载]使用 Web 服务虚拟化 Oracle 数据库
<p>信息来源: <font color="#cc0000">oracle.com</font></p><p><span class="boldbodycopy">了解 Oracle 数据库 10<em>g</em> 的数据库 Web 服务,及其在面向服务的体系结构中的作用。</span> </p><p /><p><table cellspacing="0" cellpadding="1" width="35%" bgcolor="#cccccc" border="0"><tbody><tr><td><table cellspacing="0" cellpadding="8" width="100%" bgcolor="#ffffff" border="0"><tbody><tr><td><span class="boldbodycopy">本文相关下载:</span><br /><img style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid" height="5" src="col/attachment/2006/5/687377.gif" width="5" /> <a class="bodylink" href="http://www.oracle.com/technology/global/cn/software/products/database/oracle10g/index.html">Oracle 数据库 10<em>g</em></a><br /><img style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid" height="5" src="col/attachment/2006/5/687377.gif" width="5" /> <a class="bodylink" href="http://www.oracle.com/technology/global/cn/sample_code/tech/java/jsp/dbwebservices.html">数据库 Web 服务调出实用程序</a></td></tr></tbody></table></td></tr></tbody></table></p><p><span class="legalese">2005 年 11 月发表</span> </p><p>正如我在 <a class="bodylink" href="http://java.sys-con.com/read/39726.htm"><em>Web 服务期刊</em></a>中发表的上一篇文章中所介绍的,Web 服务使您可以使用行业标准机制轻松地访问远程内容和应用程序功能,而不用依赖供应商的平台、位置、服务实施或数据格式。 因此,Web 服务是实现资源虚拟化(构建企业网格的关键要求)的主要方法。 </p><p /><p>尽管基于符合标准的中间件的面向服务的体系结构 (SOA) 在该领域获得了广泛的关注,但数据库 Web 服务(通过 HTTP 和 SOAP 等标准 Web 服务机制调用数据库操作)却非常流行。 根据 2004 Evans Data Corporation 调查,超过三分之二的调查对象表示他们正在开发或部署<a class="bodylink" href="http://www.oracle.com/technology/global/cn/tech/java/java_db/index.html">数据库 Web 服务</a>。 </p><p /><p>Oracle 数据库 10<em>g</em> 可以在两个 Web 服务模式下工作: 作为 Web 服务使用方(从数据库内部调用外部 Web 服务)或 Web 服务提供方(客户端通过 Internet/Intranet 调用数据库操作,从而对这些操作进行“虚拟化”)。 Oracle 数据库 10<em>g</em> 同时支持这两个模式 — 在使用方模式下,生成 Java 代理类和 PL/SQL 包装程序,并根据给定的 Web 服务定义语言 (WSDL) 文件将相应的文件加载到数据库中;在提供方模式下,支持在 SOA 中将 PL/SQL、Java 存储过程、SQL 查询和 SQL DML 发布为 Web 服务。 (有关更多详细信息,请参见技术白皮书<a class="bodylink" href="http://www.oracle.com/technology/tech/java/sqlj_jdbc/pdf/twp_appdev_java_whats_new_4_java_jdbc_web_services.pdf">“Oracle 数据库 10<em>g</em> 中 Java DB、JDBC 和数据库 Web 服务的新特性”</a>)。 </p><p /><p>在本文中,我将从较高层面对这两种类型的数据库 Web 服务进行介绍,循序渐进地指导您如何运行自己的数据库 Web 服务演示,并将阐述在 SOA 中集成数据库 Web 服务的好处。 </p><p /><p>有关开发和部署数据库 Web 服务的更多信息,请参见我撰写的<a class="bodylink" href="http://www.elsevier.com/wps/find/bookdescription.cws_home/706089/description#description"><em>使用 Java 和 Web 服务进行 Oracle 数据库编程</em></a>一书(该书即将由 Elsevier Digital Press 出版);您可以在<a class="bodylink" href="http://www.oracle.com/technology/books/pdfs/mensah_ch1.pdf">此处</a>下载“预览”章节。 该书将包含更多数据库 Web 服务示例。 </p><p /><p><span class="parahead1">将数据库用作 Web 服务使用方</span> </p><p /><p>通过将数据库用作 Web 服务使用方,数据库的涵盖范围得以扩展(通过 SQL 查询或批处理作业/计划作业),其中将包括动态数据(如股票价格)、按需生成的数据(如信用卡授权)、定期更改的数据(如 IRS 表)或原有系统(通过 Web 服务包装程序)以及任何通常可以通过 Web 服务机制(如联机生物信息学/基因组数据库)访问的数据。 </p><p /><p>首先,我们了解一下如何为 Oracle 数据库提供 Web 服务支持。 </p><p /><p><strong>Web 服务调出实用程序。</strong> 以 OTN 中<a class="bodylink" href="http://www.oracle.com/technology/sample_code/tech/java/jsp/dbwebservices.html">免费下载</a>形式提供的数据库 Web 服务调出实用程序(在 Oracle9<em>i</em> 和 Oracle 10<em>g</em> 版本中)通过将纯 Java Web 服务客户端程序系列加载到数据库中,将现有数据库转换为 Web 服务使用方。 这是一个一次性操作。 </p><ol><li>将该调出实用程序解压缩到 $ORACLE_HOME 下。 </li><li>将 dbwsclient.jar 文件加载到 SYS 模式(实现共享)中,或加载到将从中调用 Web 服务客户端的特定模式中: <pre>% loadjava -u sys/change -r -v -f -s -grant public -genmissing <br /> sqlj/lib/dbwsclient.jar</pre></li></ol><p>接下来,对于要从数据库中调用的每个 Web 服务,您将执行静态调用(推荐)或动态调用。 </p><p /><p><strong>静态 Web 服务调出(编译时)。</strong>在给定 WSDL 文件或服务 URL 的情况下,JPublisher(一个数据库实用程序,用于生成 Java 类以在 Java 客户端程序中表示数据库实体)将执行三个操作: </p><ul><li>生成要直接在支持 Java 和支持 Web 服务的 Oracle 数据库中使用的相应 Java 客户端代理 </li><li>在 Java 代理上生成 PL/SQL 包装程序包,以便 SQL 和 PL/SQL 能够对外部 Web 服务调用操作 </li><li>将所有内容加载(如果您选择加载)到给定的数据库模式中,前提是它具有相应的权限 </li></ul><p>您将需要为 Web 服务调出指定几个 JPublisher 选项: </p><ul><li><tt><font face="新宋体">proxywsdl</font></tt> — 要调用的 Web 服务的 WSDL 文件的 URL </li><li><tt><font face="新宋体">user</font></tt> — 为其生成 PL/SQL 包装程序的数据库模式(和口令) </li><li><tt><font face="新宋体">httpproxy</font></tt> — 用于访问 WSDL 文件的 HTTP 代理主机和端口 </li><li><tt><font face="新宋体">sysuser</font></tt> — 具有 SYSDBA 权限的数据库模式,使 JPublisher 能够将生成的文件加载到数据库中。 如果不声明该参数,则必须将生成的文件手动加载到数据库中。 </li><li><tt><font face="新宋体">proxyopts</font></tt> — 特定于 proxywsdl 的选项列表 </li><li><tt><font face="新宋体">dir</font></tt> — 所有生成文件的存储目录 </li></ul><p>Oracle 10<em>g</em> 第 2 版 JPublisher 还支持基本类型数组和 JavaBeans 等复杂类型。 </p><p /><p>让我们看一个例子。 下面的简短演示使用了 <tt><font face="新宋体">getQuote</font></tt> Web 服务(由 <a class="bodylink" href="http://www.xmethods.net/">www.xmethods.net</a> 免费提供)并提供延迟 20 分钟的股票报价;您可以使用类似的与动态数据相关的 Web 服务来运行该演示。 </p><p /><p>WSDL 位于 <a class="bodylink" href="http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl">[url]http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl[/url]</a> 中。 单击“分析 WSDL”链接可以获得端点位置,Web 服务在该位置侦听传入的请求。 该端点位于 <a class="bodylink" href="http://64.124.140.30:9090/soap">[url]http://64.124.140.30:9090/soap[/url]</a> 中;单击“操作”链接可以获得操作和方法名。 </p><p /><p>首先,确认 dbwsa.jar、JDBC 和 JPublisher/SQLJ 库($OH/sqlj/lib/translator.jar、$OH/sqlj/lib/runtime12.jar)位于 CLASSPATH 中。 </p><p /><p>然后,运行以下 JPublisher 命令生成 Web 服务客户端代理和 PL/SQL 包装程序,并将它们透明地加载到数据库的 JVM 中。 为使生成的代码能够在数据库中正常运行,请确保客户端 JDK 与 Java 运行时兼容。 (Oracle9<em>i</em> 第 2 版与 JDK-1.3.x 兼容,而 Oracle 数据库 10<em>g</em> 与 JDK 1.4.x 兼容;我在本示例中使用了 Oracle 10<em>g</em> 第 2 版 JPublisher。) 此外,请与您的 DBA 核对系统口令。 </p><pre>$ jpub -u scott/tiger -sysuser system/manager -proxywsdl=http://services.xmethods.net/soap/urn:xmethods-delayed<br />-quotes.wsdl -proxyopts=tabfun -httpproxy=www-proxy.us.oracle.com:80 -endpoint=http://64.124.140.30:9090/soap -dir=quotesquotes/src/genproxy/NetXmethodsServicesStockquoteStockQuotePortClient<br />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</pre><p>您还可以计划批处理作业,该作业将定期调用特定的 Web 服务并存储结果。 </p><p /><p>或者,您可以使用 UTL_DBWS 程序包在运行时动态生成代理、方法名和参数。 该程序包支持动态调用接口 (DII)(动态调用的变体),后者在运行时生成服务端点接口。 但是,从数据库中动态调用外部 Web 服务目前不支持复杂类型,而只支持可以映射为 SQL 或 PL/SQL 内置类型的 XML 类型。 </p><p /><p><strong>Web 服务数据源(表函数)。</strong> 您还可以通过 Oracle 数据库表函数机制(允许将二进制结果集作为虚拟表进行处理)从单个或多个 Web 服务中查询 SQL 函数并将其应用于结果集。 (有关完整的示例,请参阅<a class="bodylink" href="http://www.oracle.com/technology/sample_code/tech/java/jsp/samples/tablefunction/Readme.html">数据库 Web 服务示例代码页</a>。) </p><p /><p>在该示例中,JPublisher <tt><font face="新宋体">-proxyopts=tabfun</font></tt> 选项为特定 Web 服务自动生成表函数包装程序。 例如,以下演示了在 SQL*Plus 中,针对要跟踪报价的(选自符号表中的)符号列表调用 <tt><font face="新宋体">getQuote</font></tt> Web 服务生成表函数,并对该表函数进行查询。 </p><p /><ol><li>首先创建符号表。 <pre>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</pre></li><li>然后,执行以下 SQL 命令;它针对该表中的每个符号调用 Web 服务,然后查询表函数(例如,结果集)。 理想情况下,您可能需要 Web 服务,它获取几个参数形式的符号并返回它们的值。 <pre>SQL> col ARG0 format a20SQL> select * from table(jpub_plsql_wrapper.to_table_getQuote<br />(cursor(select * from symbtab)));ARG0 RES-------------------- ----------ORCL 12.64CSCO 17.12QCOM 43.4QQQQ 38.2799GOOG 353.58EBAY 38.2YHOO 35.427 rows selected.</pre></li></ol><p>输出显示给定符号的报价。 您可以对表函数应用 SQL 运算符(MIN、MAX、AVG 等)。 还可以存储值并计划批处理作业,该作业定期刷新这些值,然后使用 SQL 的强大功能挖掘该表。 </p><p /><p>有关更多详细信息,请参阅 <em>Oracle 数据库 JPublisher 指南</em>中的<a class="bodylink" href="http://download.oracle.com/docs/cd/B19306_01/java.102/b14188/optinfil.htm#sthref539">“简化 Web 服务调出的选项”</a>或上面提到的我所撰写的书籍。 </p><p /><p><span class="parahead1">将数据库用作 Web 服务提供方</span> </p><p /><p>利用将数据库转换为 Web 服务提供方这一功能,数据库的功能得以扩展到 Web 服务客户端应用程序,方法是通过标准的 Web 服务机制允许执行数据库操作和数据检索。 </p><p /><p>例如,许多客户将现有的数据库资源(如 PL/SQL 存储过程/函数和程序包、Java 存储过程/函数、预定义的 SQL 查询、DML 和 Oracle 高级查询进程)重用为基于标准的 Web 服务。 换言之,该服务是使用数据库产物实现的并在数据库内部运行。因此,数据库开发人员和 DBA 无需掌握 Java 或 Web 服务编程技术便可以利用它们。 </p><p /><p>为实现该目标,可以利用 JPublisher 的功能为单个或一组数据库操作生成 Java 代理。 具体而言,可以在 <a class="bodylink" href="http://www.oracle.com/technology/global/cn/products/ias/index.html">Oracle 应用服务器</a>中将 Java 代理类发布为标准 J2EE Web 服务;为容纳数据库模型,可以使用模式、参数和代码生成选项扩展后者的集成 Web 服务汇编程序。 与在中间层上部署的任何其他基于 J2EE 的 Web 服务一样,生成的 Web 服务端点由 Oracle 应用服务器运行时管理。 </p><p /><p>在 Web 服务上调用函数时,Java 代理使用 JDBC 在数据库中调用相应的操作。 随后在数据库中执行该服务,将结果集包装到 SOAP 消息中,然后发送回服务请求程序。 </p><p /><p>此外,JPublisher 还允许映射 Oracle 应用服务器 Web 服务框架不支持的数据库类型,如 Ref 游标或 PL/SQL 布尔值。 </p><p /><p>有关更多详细信息,请参阅 JPublisher <a class="bodylink" href="http://download.oracle.com/docs/cd/B19306_01/java.102/b14188/toc.htm">文档</a>、<a class="bodylink" href="http://download.oracle.com/docs/cd/B19306_01/java.102/b14187/toc.htm">Oracle 数据库 Java 开发人员指南</a>和 <a class="bodylink" href="http://download.oracle.com/docs/cd/B14099_14/web.1012/b14027/toc.htm">Oracle 应用服务器 Web 服务开发人员指南</a>。 </p><p /><p><span class="parahead1">选择实施和包装 </span></p><p /><p>某些客户倾向于将 Web 服务框架与数据库(Oracle 数据库 Web 服务的当前包装)分开,而其他客户倾向于使用集成包装(受 Oracle 数据库原生支持的数据库 Web 服务提供程序)。 每个实现各有优缺点。 </p><p /><p>首先,通过 HTTP 直接在 Oracle 数据库中处理 WSDL 和 SOAP 请求和响应从技术上是可行的。 尽管这样的方法可以满足简单 Web 服务的需要,但它无法满足企业 Web 服务和 SOA(稍后将对其进行详细介绍)的可伸缩性要求。 </p><p /><p>其次,Web 服务和 SOA 框架供应商正在积极地增加新规范(QOS、互操作性等)或增强现有规范。 我认为,与可以简单上载的 Web 服务客户端程序系列不同,Web 服务提供程序和 SOA 程序系列更复杂,并且在灵活的中间层环境(而非更稳定的 RDBMS 环境)中能够得到更妥善地处理。 </p><p /><p>第三,包括 Oracle 在内的大多数供应商针对中间层和 RDBMS 层使用的是同一 Web 服务和 SOA 框架,因此可以在数据库层和应用服务器层之间提供一致的 Web 服务开发或组装、部署和管理。 下一部分将介绍此类包装的好处。 </p><p /><p><span class="parahead1">在 SOA 中集成 Oracle 数据库</span> </p><p /><p>SOA 是一个基于 Web 服务标准和规范的概念,这使得用户可以构造客户端应用程序,并可在其中简单地注册、发现并使用通过企业网格部署的服务。 我们已经了解了如何将数据库操作公开为标准的 Web 服务,下面我们将更深入了解一番: 如何使这些服务成为企业 SOA 的一部分。 </p><p /><p>通过 Java 代理将数据库操作公布为 Web 服务,使这些代理可以继承 <a class="bodylink" href="http://www.oracle.com/technology/global/cn/products/middleware/index.html">Oracle 融合中间件</a> SOA 框架(包括 WS 互操作性、Web 服务可靠的消息处理、WS 安全性、Web 服务管理和 BPEL 集成)的互操作性和 QOS: </p><ul><li><strong>Web 服务互操作性。</strong> 注意,互操作性是实现所有 Web 服务承诺的关键。 WS-I 组织通过 <a class="bodylink" href="http://www.ws-i.org/Profiles/BasicProfile-1.0-2004-04-16.html">WS-I Basic Profile 1.0</a> 规范指定了 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,而且还强调与其他供应商/商家规范的互操作性。 </li><li><strong>Web 服务可靠的消息处理。</strong> Oracle 应用服务器为基于 SOAP 的 Web 服务实现可靠的消息处理;它具有开放性,并在 Web 服务之间提供了可靠的 SOAP 消息处理。 消息最少发送一次(有保证的发送)、最多发送一次(有保证的消除重复)或只发送一次(有保证的发送并消除重复)。 Oracle 应用服务器当前实施 OASIS 标准 WS-Reliability,并且 Oracle 是 OASIS WS-ReliableExchange 组的一员,以将 WS-Reliability 与 WS-ReliableMessaging 合并,从而确保一个可互操作的行业范围采用的可靠消息处理标准。 Oracle 数据库 Web 服务可以在 SOA 中使用这些服务。 </li><li><strong>WS 安全性。</strong> WS 安全性规范通过 XML 数字签名提供了安全的 SOAP 消息,通过 XML 加密提供机密性,并通过 Username Token 和 X509 Token 提供证书传播。 Oracle Web 服务管理者工具使您可以使用代理和网关通过 WS 安全性保证数据库 Web 服务的安全。 </li><li><strong>Web 服务管理。</strong> <a class="bodylink" href="http://www.oracle.com/technology/global/cn/products/webservices_manager/index.html">Oracle Web 服务管理器</a>的独特管理框架提供了 Web 服务访问控制、一次性登录、集中的安全性策略管理,Sarbanes-Oxley、Gramm-Leach-Bliley 和 HIPAA 等规范的实施 ,并监控 WS 安全性、Web 服务可靠的消息处理、记录和审计。 这些特性通过一系列 Java 管理扩展 (JMX) 管理 Bean (Mbean) 公开。 </li><li><strong>BPEL 集成。</strong> BPEL 是新兴的业务流程定义标准;可以将它看作是 Web 服务的工作流。 数据库 Web 服务可以是 <a class="bodylink" href="http://www.oracle.com/technology/global/cn/products/ias/bpel/index.html">Oracle BPEL 流程管理器</a>(它提供了 rpc/encoded 以及 doc/literal 消息处理)编排的复杂 Web 服务工作流流程的一部分。 </li></ul><p><span class="parahead1">结论</span> </p><p /><p>您已经看到,数据库 Web 服务在企业级 SOA 中具有重要作用。 但从 Oracle DBA 和数据库开发人员的角度而言,数据库 Web 服务最有意义的方面是可帮助他们重用数据库资源,同时不受 Java 或 SOAP、WSDL 以及 UDDI 编程的影响。 </p>页:
[1]
