websphere使用
信息即服务模式
部署SOA来重新利用资产,以便通过与协议无关的数据交换来公开其数据或应用程序逻辑,以便在整个企业内重用。 关系数据库是企业体系结构中最有价值和最普遍的部分之一。 IBM®WebSphere®DataPower®XI50集成设备具有增强的安全性,XML DoS保护和近线速度性能,能够用作存储在SOA中关系数据库中的企业数据的可行代理。 通过DataPower Appliance,可以将数据库视为可通过HTTP协议(如SOAP和REST)甚至非Web协议(如MQ和JMS)访问的服务端点。 这种SOA驱动的模式称为信息即服务 (IaaS)。
从3.7.1固件版本开始,DataPower数据库支持更加复杂。 通过使用参数标记和对存储过程调用的完全支持等功能,可以更好地使用本机数据库技术。 其他增强功能允许与DB2®pureXML直接交互,使XML成为通用语言 ,并使数据库成为不断增长的SOA中更不可或缺的参与者。 图1说明了通过DataPower Appliance与后端数据库协作的网络流量流:
图1. DataPower利用本机数据库XML支持
DataPower数据库支持
在请求,响应和错误规则处理期间,可以在DataPower Appliance上处理企业数据的存储和检索。 DataPower有几种与已配置SQL数据源进行交互的方式。 一种流行的方法是在规则处理期间触发SQL Action。 另一个是通过dp:sql-execute()
扩展功能和<dp:sql-execute>
扩展元素直接支持在XSL转换中执行语句。 虽然这两种方法都支持执行SQL和XQuery语句,但它们的设计和功能使其成为不同的工具,这些工具可在实现IaaS模式时提供灵活性。
要允许与数据库交互,DataPower管理员必须首先在设备内定义一个SQL数据源对象。 数据源是连接到数据库实例所需的信息的集合,例如连接池属性以及数据库主机,服务器端口和身份验证凭据。 可以从许多管理界面执行配置,管理员可以在其中选择添加,删除,编辑,启用和禁用数据源。 在域内指定数据源配置,例如图2中的配置,以便该域内的所有服务对象和样式表都可以使用定义的数据源:
图2. DataPower数据源配置
DataPower中数据库交互的基础
使用DataPower设备向数据库发送数据和从数据库接收数据的两种最常见方法是SQL Action和XSL扩展。
SQL动作
SQL操作以指定所有其他操作的相同方式添加到处理规则中:
图3.处理规则中SQL操作
SQL操作位于“高级操作”菜单下,并在上面的图3中的处理规则中突出显示。 此操作提供了三种指定查询的方式。 第一个是直接定义SQL或XQuery语句的静态字符串。 第二个是保存在DataPower变量中的查询字符串,可能是在先前的处理中创建的。 第三个是作为XSL转换的文本输出生成的查询。 图4显示了使用静态SQL语句定义SQL Action的配置:
图4. SQL Action配置
XSLT支持
XI50设备中的dp:sql-execute()
扩展功能提供了在XSL样式表中执行SQL查询的功能。 3.7.1固件版本引入了<dp:sql-execute>
扩展元素,该扩展元素扩展了设备与数据库有关的功能。
在XSLT样式表中启用IaaS模式
dp:sql-execute()
函数是允许SQL语句直接在DataPower设备上的XSL转换内直接使用的第一个启动器。 清单1显示了dp:sql-execute()
函数的使用,该函数处理典型的数据库查询,该查询从ORDERS
表中检索有关总价超过最低成本的订单的信息:
清单1. dp:sql-execute()的基本用法
<xsl:template match="/">
<xsl:variable name="query">
SELECT * FROM ORDERS WHERE customer_id =
<xsl:value-of select="$customer_id"/>
AND total > <xsl:value-of select="$min_total"/>
</xsl:variable>
<xsl:variable name="result" select="dp:sql-execute('db2datasource',$query)" />
<xsl:copy-of select="$result" />
</xsl:template>
此语法要求在调用dp:sql-execute()
函数之前将整个语句(SQL和值)序列化为单个字符串。 序列化需要使用内联<value-of>
元素来检索组成查询的值。 执行INSERT
要求XML与dp:serialize
元素类似地进行序列dp:serialize
。 考虑以下将数据插入数据库的输入XML文档和XSL样式表:
清单2.示例输入XML
<?xml version="1.0" encoding="UTF-8"?>
<order id="134">
<customer id="32493">Sam</customer>
<total>34.98</total>
<product>XML for Noobies</product>
</order>
清单3.使用dp:sql-execute()进行数据插入
<xsl:template match="/">
<xsl:variable name="query">
INSERT INTO ORDERS VALUES
(<xsl:value-of select="./order/@id"/>,
<xsl:value-of select="./order/customer/@id/>,
<xsl:value-of select="./order/total/text()"/>,
<dp:serialize omit-xml-decl="yes" select="./"/>)
</xsl:variable>
<xsl:variable name="result" select="dp:sql-execute('db2datasource',$query)" />
<xsl:copy-of select="$result" />
</xsl:template>
dp:sql-execute()
函数是在很大程度上静态的简单查询的有用工具,但是语句序列化使查询变得复杂或庞大时难以使用该函数。 查询的大小也受到限制,这意味着静态语句只能包含少量数据。 文字语句也无法利用某些数据库性能优化。 另外, dp:sql-execute()
函数不支持参数标记和带有输出参数的存储过程。 <dp:sql-execute>
扩展元素有助于缓解dp:sql-execute()
函数的这些缺陷。 扩展元素填补了DataPower作为数据库客户端的功能,从而增强了其启用IaaS架构的能力。 此扩展元素添加了dp:sql-execute()
函数或SQL Action无法使用的以下功能:
- 参数标记支持(例如
'SELECT * FROM ORDERS WHERE CUSTOMER_ID = ?'
) - 支持使用
INPUT
,INPUT_OUTPUT
和OUTPUT
参数的存储过程
<dp:sql-execute>
元素为可以在XSL样式表中构造SQL和XQuery语句增加了效率和可维护性。
使用<dp:sql-execute>元素的参数标记支持
参数标记使动态SQL语句高度可维护。 参数标记将静态和动态内容分开,这些内容最终组合形成一个完整SQL语句。 它们充当由SQL语句的静态部分包围的值的占位符。 在处理过程中,根据标记在子<argument>
节点中的定义,在dp:sql-execute
元素中以编程方式设置标记的值。 使用dp:sql-execute()
函数时,需要将整个SQL语句序列化为单个字符串。 <dp:sql-execute>
扩展元素和参数标记使SQL语句可以逻辑构建。 下面的清单4显示了如何使用参数标记来执行与清单1所示相同的SELECT
查询。
清单4.使用<dp:sql-execute>来选择数据
<xsl:template match="/">
<xsl:variable name="statement">
SELECT * FROM ORDERS WHERE customer_id = ? AND total > ?
</xsl:variable>
<xsl:variable name="result">
<dp:sql-execute source="'db2datasource'" statement="$statement">
<arguments>
<argument>
<xsl:value-of select="$customer_id"/>
</argument>
<argument>
<xsl:value-of select="$min_total"/>
</argument>
</arguments>
</dp:sql-execute>
</xsl:variable>
</xsl:template>
<dp:sql-execute>
元素也使处理XML输入变得更加容易。 下面清单6中的样式表摘录演示了比清单3稍复杂的INSERT
。 该节点从清单5中的输入XML文档遍历XML节点<orders>
,并将找到的每个订单插入ORDERS
表中。 它演示了许多重要功能,例如<xsl:copy-of>
元素用于隐式XML序列化的使用:
清单5.具有多个值的输入XML
<?xml version="1.0" encoding="UTF-8"?>
<orders>
<order id="134">
<customer id="32493">Sam</customer>
<total>34.98</total>
<product>XML for Noobies</product>
</order>
<order id="209">
<customer id="43245">Ron</customer>
<total>25.22</total>
<product>DataPower Hacks</product>
</order>
</orders>
以下样式表使用<dp:sql-execute>
扩展元素将清单5中的数据插入数据库中:
清单6.使用<dp:sql-execute>进行数据插入
<xsl:template match="/orders">
<xsl:variable name="statement">INSERT INTO ORDERS VALUES (?,?,?,?)</xsl:variable>
<dp:sql-execute source="'db2datasource'" statement="$statement">
<xsl:for-each select="order">
<arguments>
<argument>
<xsl:value-of select=".@id"/>
</argument>
<argument>
<xsl:value-of select="./customer/@id/>
</argument>
<argument>
<xsl:value-of select="./total/text()"/>
</argument>
<argument>
<xsl:copy-of select="."/>
</argument>
</arguments>
</xsl:for-each>
</dp:sql-execute>
</xsl:template>
尽管这两个示例都可以使用dp:sql-execute()
扩展功能dp:sql-execute()
,但它们在样式表中的可读性和可维护性将更加困难。 参数标记可帮助您指定干净高效SQL语句,以及使您能够插入更大的数据集。
调用存储过程
由于企业体系结构的过程根源,存储过程是数据库中的主体。 它们的重要性已得到认可,并已合并到<dp:sql-execute>
元素中。 存储过程可以重用SQL语句。 通过使数据库避免为每个查询准备语句,而是缓存任何查询优化例程,它们可以提高多次运行查询的性能。 DataPower中存储过程的使用模式类似于清单4和清单6中的示例,并在下面的清单7中再次用参数标记进行了演示。 注意,从<dp:sql-execute>
扩展元素调用的存储过程可以通过mode
属性为参数指定参数的方向:
清单7.使用存储过程进行参数标记
<xsl:template match="/">
<xsl:variable name="result">
<dp:sql-execute source="'db2datasource'"
statement="'{CALL GET_PRODUCT(?,?,?)}'">
<arguments>
<argument type="SQL_INTEGER" mode="INPUT">
<xsl:value-of select="@id"/>
</argument>
<argument type="SQL_VARCHAR" mode="INPUT_OUTPUT">
<xsl:value-of select="@sku"/>
</argument>
<argument type="SQL_XML" mode="OUTPUT"/>
</arguments>
</dp:sql-execute>
</xsl:variable>
</xsl:template>
具有多个结果集的存储过程
存储过程可以执行后返回多个结果集; 3.7.1固件中的所有SQL方法都支持此功能。 与返回一个结果集的存储过程相比,调用返回一个结果集的存储过程没有什么区别。 但是,与从标准SQL / XQuery语句返回的结果相比,将返回其他元数据以及从调用存储过程返回的结果集。 其他元数据包括:
- 所有
INPUT_OUTPUT
或OUTPUT
参数。 - 封装离散结果集的
<resultSet>
节点 -
<metadata>
<resultSet>
节点中的<metadata>
节点,用于描述结果集的结构
例如,存储过程可以返回以下XML:
清单8.具有多个结果集的XML
<sql result="success">
<parameter position="1">value</parameter>
<parameter position="2" isNull="true"/>
...
<resultSet>
<metadata>
<columnInfo index="index" nullable="nullable" name="name"
precision="precision" scale="scale" type="type"/>
...
</metadata>
<row>
<column>
<name>name1</name>
<value>value1</value>
</column>
<column>
<name>name2</name>
<value isNull="true"/>
</column>
...
</row>
...
</resultSet>
<resultSet>
<metadata>
...
</metadata>
<row>
...
</row>
...
</resultSet>
...
</sql>
将零值字符串与NULL值区分开
在上面清单8所示的结果集中,请注意其中一个值节点中的isNull
属性。 即明确的值之间的这种属性分化带来NULL
从一个非空值,该值是一个零长度的字符串。
将我们学到的一切都放在最后一个例子中
假设有关公司DataPower Appliances的以下数据在ASSETS
表中:
表1.数据库中的ASSET表
模型 | 位置 | 系列 |
---|---|---|
XA35 | B502 | 4777-8643 |
XS40 | B502 | 5908-1324 |
XS40 | B500 | 5823-0923 |
XI50 | B500 | 6021-3452 |
XI50 | B503 | 6341-2934 |
数据库中的存储过程会添加资产,并返回公司拥有的相同模型的新资产总数。 使用以下SQL创建存储过程:
清单9.存储过程
CREATE PROCEDURE ADD_DATAPOWER_ASSET
@model varchar(4),
@location varchar(4),
@serial varchar(9),
@count int OUTPUT,
BEGIN TRANSACTION
INSERT ASSETS (MODEL, LOCATION, SERIAL)
VALUES (@model, @location, @serial)
SELECT @count = COUNT(*) FROM ASSETS WHERE MODEL = @model
COMMIT TRANSACTION
样式表通过<dp:sql-execute>
元素调用此过程以添加XI50资产。 该机器是刚刚采购的,尚未安装在某个位置,因此location列的值临时设置为null
:
清单10. XSL样式表
<xsl:template match="/">
<xsl:variable name="result">
<dp:sql-execute source="'db2datasource'"
statement="'CALL ADD_DATAPOWER_ASSET(?, ?, ?, ?)'"/>
<arguments>
<argument type="SQL_VARCHAR" mode="INPUT ">
XI50
</argument>
<argument type="SQL_VARCHAR" mode="INPUT" isNull="true" />
<argument type="SQL_VARCHAR" mode="INPUT">
6987-2541
</argument>
<argument type="SQL_INTEGER" mode="OUTPUT" />
</arguments>
<dp:sql-execute>
</xsl:variable>
</xsl:template>
该调用返回以下XML,以便在结果变量中进行后处理。 清单11显示了生成的XML,并在OUTPUT
参数中返回了XI50资产的更新计数:
清单11.结果
<sql result="success">
<parameter position="4">3</parameter>
</sql>
该表现在包含新资产:
表2.更新的ASSET表
模型 | 位置 | 系列 |
---|---|---|
XA35 | B502 | 4777-8643 |
XS40 | B502 | 5908-1324 |
XS40 | B500 | 5823-0923 |
XI50 | B500 | 6021-3452 |
XI50 | B503 | 6341-2934 |
XI50 | 空值 | 6987-2541 |
结论
DataPower设备为SOA提供了极大的灵活性,因为它在网络中的独特位置使其能够有效地处理企业数据的请求,处理,安全性和验证。 DataPower XI50中数据库功能的增强(例如<dp:sql-execute>
扩展元素)使X150可以进一步简化进出数据库的数据流。
此概述可能使您对使用DataPower满足Web服务请求和维护企业数据的可能性感到兴奋。 IBM Data Studio团队已经意识到了该方案的强大功能,并开发了Data Web Services作为IBM Data Studio Developer的功能。 此工具可帮助您快速将SQL语句公开为Web服务,并生成可部署在DataPower设备上的构件,从而启用IaaS模式。 developerWorks文章IBM Data Studio Developer V1.2中的新增功能可以帮助您了解一起使用IBM Data Studio和DataPower多么容易。
翻译自: https://www.ibm.com/developerworks/websphere/library/techarticles/0812_callaway/0812_callaway.html
websphere使用