websphere使用_使用WebSphere DataPower SOA Appliances启用信息即服务模式

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支持
图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数据源配置
图2. DataPower数据源配置

DataPower中数据库交互的基础

使用DataPower设备向数据库发送数据和从数据库接收数据的两种最常见方法是SQL Action和XSL扩展。

SQL动作

SQL操作以指定所有其他操作的相同方式添加到处理规则中:

图3.处理规则中SQL操作
图3.处理规则中SQL操作

SQL操作位于“高级操作”菜单下,并在上面的图3中的处理规则中突出显示。 此操作提供了三种指定查询的方式。 第一个是直接定义SQL或XQuery语句的静态字符串。 第二个是保存在DataPower变量中的查询字符串,可能是在先前的处理中创建的。 第三个是作为XSL转换的文本输出生成的查询。 图4显示了使用静态SQL语句定义SQL Action的配置:

图4. 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无法使用的以下功能:

  1. 参数标记支持(例如'SELECT * FROM ORDERS WHERE CUSTOMER_ID = ?'
  2. 支持使用INPUTINPUT_OUTPUTOUTPUT参数的存储过程

<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语句返回的结果相比,将返回其他元数据以及从调用存储过程返回的结果集。 其他元数据包括:

  1. 所有INPUT_OUTPUTOUTPUT参数。
  2. 封装离散结果集的<resultSet>节点
  3. <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使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值