嵌入式qt 字体 缓存_设置嵌入式全局高速缓存以在IBM Integration Bus V10中实现高可用性-程序员宅基地

技术标签: python  java  linux  mysql  数据库  

嵌入式qt 字体 缓存

企业应用程序可能需要经常访问保存在数据库或文件中的数据,从而对性能产生负面影响。 为了减少查询时间和使用的处理器资源量,可以将数据加载到缓存中。 IBMIntegration Bus V10提供了一个嵌入式全局缓存,该缓存在多个流之间共享,并部署在多个集成服务器和集成节点上。 这种快速的分布式缓存结构存储在集成服务器的JVM堆中。 当集成服务器发生故障或重新启动时,将清除缓存,并且所有存储的数据都将丢失。 对于需要高可用性缓存的企业解决方案,这种数据丢失是不可接受的。

全局缓存的另一个缺点是缓存结构,它由简单的键值对组成。 应用程序查找密钥,然后缓存返回一个值。 此基本方法仅适用于具有两列的数据库表,其中一列是唯一键,另一列是对应的值。 大多数企业应用程序必须访问复杂得多的数据,这些数据需要复杂的选择标准才能进行检索。 本文介绍如何为嵌入式全局缓存设计容错拓扑。 它显示了如何使用CDATA XML和标记格式将数据加载到缓存中,并提供了用于复杂查询的示例ESQL函数。

高可用性缓存的设计解决方案

设计高可用性缓存时,请考虑以下概念和准则:

  • 要在高可用性配置中运行,IBM Integration Bus可以与IBMWebSphereMQ多实例队列管理器( 多实例配置)一起使用。
  • 缓存存储在集成服务器的JVM堆中。 因此,每次重新启动集成服务器时,都会清除高速缓存,并且必须重新加载高速缓存。
  • 目录服务器是用于控制和管理缓存的组件。
  • 容器服务器是保存缓存数据子集的组件。
  • 至少需要两个目录和两个容器来管理一个故障。
  • 多实例集成节点不能承载目录服务器。
  • 如果您有多个目录服务器,则必须至少启动两个目录服务器才能使高速缓存可用。
  • 集成服务器最多包含一个目录服务器。
  • 一个集成节点最多包含四个容器服务器。

基于这些准则的示例设计解决方案由两个LinuxRedHat6.5服务器组成,在这里称为系统X和系统Y。 系统X( 活动系统 )通常包含企业应用程序; 当系统X发生故障或发生切换时,系统Y( 备用系统 )将运行企业应用程序。 IBM WebSphere MQ V8.0安装了在系统X和系统Y之间共享的文件系统中定义的多实例队列管理器。高速缓存是易失性结构,因此数据永久存储在Oracle11g表中。 每个集成服务器启动后,数据将从数据库加载到缓存。

IBM Integration Bus V10运行企业应用程序并保存高速缓存。 这些应用程序在包含两个集成服务器( APPL_A和APPL_B )的多实例集成节点( IB10NODE )中运行。 每个集成服务器都包含一个缓存容器和企业应用程序。 多实例集成节点IB10NODE通常在系统X上处于活动状态; 在故障情况下,节点切换到系统Y.缓存由单实例集成节点管理:IB10NODE_CACHE01上系统X和IB10NODE_CACHE02上系统Y.

集成节点IB10NODE_CACHE01包含两个集成服务器( Cache01_A和Cache02_B ),每个服务器都有一个目录服务器,因此,当此集成节点运行时,缓存可用。 集成服务器Cache01_A正在运行应用程序Load_Cache,用于从数据库加载缓存。 系统Y上的集成节点IB10NODE_CACHE02确保了具有两个集成服务器(C ache02_A和Cache02_B )的高速缓存的高可靠性,每个集成服务器都有一个目录服务器。 如果系统X或集成节点IB10NODE_CACHE01不可用,则高速缓存由节点IB10NODE_CACHE02管理。

图1.具有高可用性高速缓存的IBM Integration Bus多实例配置
具有高可用性高速缓存的IBM Integration Bus多实例配置

实施高可用性缓存

在配置高速缓存之前,请安装和配置Linux系统和IBM Integration Bus节点(本文未涵盖)。

要配置缓存:

  1. 创建一个策略文件。 部署复杂的缓存拓扑的最佳方法是使用描述拓扑的策略文件。 表1显示了示例解决方案中使用的基础结构拓扑。
    表1.高可用性高速缓存拓扑
    整合节点 类型 数量
    目录服务器
    整合伺服器 IP服务器 端口范围
    IB10节点 多实例 0 APPL_A
    APPL_B
    192.0.2.1
    192.0.2.2
    3020年-3039年
    IB10NODE_CACHE01 单实例 2 CACHE01_A
    CACHE01_B
    192.0.2.1 3000-3019
    IB10NODE_CACHE02 单实例 2 CACHE02_A
    CACHE02_B
    192.0.2.2 3000-3019

    容器的数量等于集成节点中定义的集成服务器的数量(总共2个); 所有其他信息都插入到策略文件Cache_Policy_File.xml中,如清单1所示。

    清单1.策略文件Cache_Policy_File.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <cachePolicy xmlns= "http://www.ibm.com/xmlns/prod/websphere/messagebroker/globalcache/policy-1.0">
    	<broker name="IB10NODE_CACHE01" listenerHost="192.0.2.1">
    		<catalogs>2</catalogs>
    		<portRange>
    			<startPort>3000</startPort>
    			<endPort>3019</endPort>
    		</portRange>
    	</broker>
    	<broker name="IB10NODE_CACHE02" listenerHost="192.0.2.2">
    		<catalogs>2</catalogs>
    		<portRange>
    			<startPort>3000</startPort>
    			<endPort>3019</endPort>
    		</portRange>
    	</broker>
    		<broker name="IB10NODE">
    		<listenerHost>192.0.2.1</listenerHost>
    		<listenerHost>192.0.2.2</listenerHost>
    		<catalogs>0</catalogs>
    		<portRange>
    			<startPort>3020</startPort>
    			<endPort>3039</endPort>
    		</portRange>
    	</broker>
    </cachePolicy>
  2. 连接到活动系统(系统X),并将策略文件应用于两个集成节点:
    mqsichangeproperties IB10NODE -b cachemanager -o CacheManager -n policy –v "Cache_Policy_File.xml"
    
    mqsichangeproperties IB10NODE_CACHE01 -b cachemanager -o CacheManager -n policy –v "Cache_Policy_File.xml"
  3. 连接到备用系统(系统Y),并将策略文件应用于集成节点:
    mqsichangeproperties IB10NODE_CACHE02 -b cachemanager -o CacheManager -n policy –v "Cache_Policy_File.xml"
  4. 重新启动所有集成节点。
  5. 要验证系统X上的配置,请运行以下命令:
    mqsireportproperties IB10NODE -e APPL_A -o ComIbmCacheManager -r
    mqsireportproperties IB10NODE -e APPL_B -o ComIbmCacheManager -r
    mqsireportproperties IB10NODE_CACHE01 -e CACHE01_A -o ComIbmCacheManager -r
    mqsireportproperties IB10NODE_CACHE01 -e CACHE01_B -o ComIbmCacheManager -r
    mqsicacheadmin IB10NODE -c showMapSizes
    mqsicacheadmin IB10NODE_CACHE01 -c showMapSizes
  6. 要验证系统Y上的配置,请运行以下命令:
    mqsireportproperties IB10NODE_CACHE02 -e CACHE02_A -o ComIbmCacheManager -r
    mqsireportproperties IB10NODE_CACHE02 -e CACHE02_B -o ComIbmCacheManager -r
    mqsicacheadmin IB10NODE_CACHE02 -c showMapSizes

当至少两个目录服务器启动时,缓存已准备就绪。 提示:首先启动高速缓存管理器集成节点(系统X上的IB10NODE_CACHE01或系统Y上的IB10NODE_CACHE02),然后启动多实例集成节点(IB10NODE)。

缓存启动后,Linux中的系统日志文件/ var / log / messages显示一条消息:

A connection has been established to the integration node global cache.  
The integration node global cache is now available for use from message processing nodes.

缓存加载和访问

因为全局嵌入式高速缓存存储在集成服务器的JVM堆中,所以可以由Java对象(例如MbGlobalMap访问,该对象在IBM Integration Bus包com.ibm.broker.pluginMbGlobalMap对象表示嵌入式全局缓存中的地图实例。 它提供了查询和修改缓存键值对的方法: getupdateput

存在一些用于通过使用键值对访问来实现缓存的解决方案。 但是,这些解决方案仅限于具有两列的数据库表,其中一列是唯一键,另一列是对应的值。 请参阅相关主题的相关文章。 本文显示了用于企业应用程序所需的复杂访问和加载操作的ESQL函数。

考虑数据库表USERS_MAP (表2)。 数据被加载到缓存映射users_map

表2.数据库表USERS_MAP
ID 名称 地址 电话号码
ID1 NAME1 地址1 电话1 州1
ID2 NAME2 地址2 电话2 状态2
ID3 NAME3 地址3 电话3 状态3
ID4 NAME4 地址4 电话4 状态4
ID5 NAME5 地址5 电话5 状态5
ID6 NAME6 地址6 电话6 状态6
ID7 NAME7 地址7 电话7 状态7

要引用缓存映射users_map的数据,应用程序将搜索列ID和NAME并提取其他列(ADDRESS,PHONE_NUMBER和STATE)。 访问缓存中键/值对的本机方法不足以实现查询或更新,其中搜索键由两列(ID和NAME)组成,并且所需的输出包含多个列(ADDRESS,PHONE_NUMBER,和STATE)。

问题是:

  • 复杂键 :应用程序如何在查询条件位于多个列的高速缓存中搜索一行(例如,高速缓存映射users_map中的ID = ID1和NAME = NAME1)?
  • 许多值 :通过单个缓存访问,应用程序如何检索满足查询搜索的所有列(例如,缓存映射users_map中的ADDRESS,PHONE_NUMBER和STATE)?

为了解决第一个问题,复杂键,您可以通过串联所有与查询条件匹配的列值来创建单个键。 例如,如果应用程序查找与列ID = ID1和列NAME = NAME1相关的缓存条目,则复杂键为: ID1$;$NAME1 。 单列值由标签分隔: $;$存储在用户定义的属性(UDP) CACHE_TAG_SEPARATOR 。 UDP的优点是可以在部署和运行时更改其值,而无需更改应用程序。

您可以通过将所有列值作为CDATA XML消息(称为CDATA XML格式)插入到缓存值字段中,或将它们与变量CACHE_TAG_SEPARATOR指定的标记分隔符进行连接来解决第二个问题,即许多值。标记格式)。

将数据库值加载到缓存中

访问缓存的第一步是将数据库表中的数据加载到缓存映射中。 可以使用Java对象MbGlobalMapputupdate方法将数据库表加载到缓存映射中。 在示例消息流LoadGlobalCacheMap ,增强了这些方法,以便在缓存键和缓存值中加载更多数据库列值。 该流在应用程序CACHE_LOADER定义。

图2中的消息流接收一个XML文件作为输入,该XML文件指定要在缓存中加载的表。 如果加载处理成功,那么该流程将使用加载的缓存映射内容或异常描述创建一个输出文件。

图2.在缓存中加载数据库的示例消息流
在缓存中加载数据库的示例消息流

输入的XML文件包含以下数据:

  • <MapName> 。 写入数据的缓存映射名称。
  • <TableName> 。 要在高速缓存映射中加载的数据库表名称。 表名之前是数据库模式名。 例如,加载该表USERS_MAP在架构中定义IBMDEV中,XML字段<TableName>包含以下字符串: IBMDEV.USERS_MAP
  • <PrimaryKey> 。 具有列名列表的文件夹,其值将插入到高速缓存键条目中。 这些值与标签分隔符( CACHE_TAG_SEPARATOR).串联在一起CACHE_TAG_SEPARATOR).

数据库列值可以作为CDATA XML消息插入到缓存值中,也可以与标签分隔符( CACHE_TAG_SEPARATOR )串联在一起。

要指定用于加载高速缓存值的两种格式中的哪一种,请在输入XML文件中使用以下文件夹之一:

  • <XMLData>. A <XMLData>. A列名,其值是否插在缓存值条目中的XML CDATA消息列表中的文件夹。
  • <TagData>. A <TagData>. A列名,其值连接起来有标签分离器,并插入到缓存值项的列表文件夹中。

例如,可以使用清单2中所示的XML输入文件将表USERS_MAP (模式IBMDEV )以CDATA XML格式加载到缓存映射users_map中。

清单2.用于加载表USERS_MAP的XML输入文件(CDATA XML格式)
<LoadMaps>
  	<LoadMap>
  		<MapName>users_map</MapName>
 		<TableName>IBMDEV.USERS_MAP</TableName>
  		<PrimaryKey>
  			<column>ID</column>
   			<column>NAME</column>
  		</PrimaryKey>
 		 <XMLData>
			<column>ID</column>
			<column>ADDRESS</column>
			<column>PHONE_NUMBER</column>
			<column>STATE</column>
  		</XMLData>
	</LoadMap>
</LoadMaps>

缓存键由数据库列IDNAME ,并且缓存值包含CDATA XML格式的数据库列IDADDRESSPHONE_NUMBERSTATE

还可以使用清单3中所示的XML输入文件,将表USERS_MAP (模式IBMDEV )以标记的格式加载到高速缓存映射users_map中。

清单3.用于加载表USERS_MAP的XML输入文件(标记格式)
<LoadMaps>
  	<LoadMap>
  		<MapName>USERS_MAP</MapName>
  		<TableName>IBMDEV.USERS_MAP</TableName>
  		<PrimaryKey>
  			<column>ID</column>
   			<column>NAME</column>
  		</PrimaryKey>
  		<TagData>
			<column>ID</column>
			<column>ADDRESS</column>
			<column>PHONE_NUMBER</column>
			<column>STATE</column>
  		</TagData>>
	 </LoadMap>
</LoadMaps>

缓存值包含标记格式的数据库列值。

您可以使用CDATA XML格式加载缓存中的某些表,并使用标记格式加载其他表。 例如,清单4只显示了用于加载表的示例输入XML文件ALIAS_MAP在CDATA XML格式化和表USERS_MAP在标记的格式。

清单4.用于加载表的XML输入文件(CDATA XML和标记格式)
<LoadMaps>
 	<LoadMap>
 		 <MapName>ALIAS_MAP</MapName>
  		<TableName>IBMDEV.ALIAS_MAP</TableName>
  		<PrimaryKey>
  			 <column>KEYNAME</column>
 		</PrimaryKey>
  		<XMLData>
   			<column>VALUE</column>
  		</XMLData>
 </LoadMap>
 	<LoadMap>
  		<MapName>USERS_MAP</MapName>
  		<TableName>IBMDEV.USERS_MAP</TableName>
  		<PrimaryKey>
  			<column>ID</column>
   			<column>NAME</column>
  		</PrimaryKey>
  		<TagData>
			<column>ID</column>
			<column>ADDRESS</column>
			<column>PHONE_NUMBER</column>
			<column>STATE</column>
  		</TagData>
	 </LoadMap>
</LoadMaps>

消息流LoadGlobalCacheMap可以通过验证ESQL指令中的文件夹<XMLData><TagData>的存在来标识加载格式(清单5)。

清单5.用于识别加载格式类型的ESQL指令
IF EXISTS(refInLoadMap.*:XMLData.*[]) THEN
	-- The value is a XML CDATA structure
	SET cSQL_SELECT_TABLE = CreateSQLQuery(refInLoadMap.*:XMLData,cTableName, rPrimaryKey  );
ELSEIF EXISTS(refInLoadMap.*:ValueData.*[]) THEN
	-- The value is a single value
	SET cSQL_SELECT_TABLE = CreateSQLQuery(refInLoadMap.*:ValueData,cTableName, rPrimaryKey  );
ELSEIF EXISTS(refInLoadMap.*:TagData.*[]) THEN
	SET cSQL_SELECT_TABLE = CreateSQLQuery(refInLoadMap.*:TagData,cTableName, rPrimaryKey  );
END IF;
			
SET rSQLQuery.SQL[] = PASSTHRU(cSQL_SELECT_TABLE);

ESQL过程CreateSQLQuery (清单6)创建一个SQL查询,用于通过使用指定格式(CDATA XML或标记的)选择要加载到缓存中的表行和列。

清单6.用于将数据加载到缓存中的示例ESQL过程
CREATE PROCEDURE CreateSQLQuery(IN rCols REFERENCE, IN cInNameTable CHARACTER,
	IN rInPrimaryKey REFERENCE) RETURNS CHARACTER
 BEGIN
	DECLARE rcolumn 	REFERENCE 	TO rCols.*:column[1];
	DECLARE cSQLQuery,cPrimKeys 		CHARACTER;
	DECLARE iPos				INTEGER;
	DECLARE cSchema, cTable		CHARACTER;
			
	-- Input Table name contains also the schema: SCHEMA.TABLENAME
	SET iPos = POSITION ('.' IN cInNameTable);
			 
	SET cSchema = SUBSTRING(cInNameTable FROM 1 FOR (iPos - 1));
	SET cTable = SUBSTRING(cInNameTable FROM  (iPos+1));	 
			 
	IF cSchema IS NULL or cTable IS NULL  THEN
		THROW USER EXCEPTION VALUES
		('ERROR Reding Database table. Table Name Unknown: ' || COALESCE(cSchema,'') || '.' || COALESCE (cTable,''));
	END IF;
			
	SET cSQLQuery = 'SELECT ';
	--
	-- Create the SQL string with the primary keys. For example:
	-- T.COL_NAME1 PRIMARY_KEY_1, T.COL_NAME1 PRIMARY_KEY_2
	--
	SET cPrimKeys =  CreatePrimKeySQL(rInPrimaryKey);
	SET cSQLQuery = cSQLQuery || cPrimKeys;

	WHILE LASTMOVE(rcolumn) DO
		SET cSQLQuery = cSQLQuery || ', T.' || rcolumn;
			
		MOVE rcolumn NEXTSIBLING REPEAT NAME;
	END WHILE; -- LASTMOVE(rcolumn)
			
	SET cSQLQuery = cSQLQuery || ' FROM  ' || cSchema || '.' || cTable || '  T';
	RETURN cSQLQuery;
END;

访问使用CDATA XML格式的缓存

如果您使用CDATA XML格式将数据库列值插入到缓存中,则缓存值将包含CDATA XML消息。 例如,如果使用清单7中的XML文件将表USERS_MAP (如表2所示)加载到缓存中,则清单8中显示了生成的缓存映射USERS_MAP

清单7.用于加载USERS_MAP表的XML输入文件(CDATA XML格式)
<LoadMaps>
  	<LoadMap>
  		<MapName>users_map</MapName>
 		<TableName>IBMDEV.USERS_MAP</TableName>
  		<PrimaryKey>
  			<column>ID</column>
   			<column>NAME</column>
  		</PrimaryKey>
 		 <XMLData>
			<column>ID</column>
			<column>ADDRESS</column>
			<column>PHONE_NUMBER</column>
			<column>STATE</column>
  		</XMLData>
	</LoadMap>
</LoadMaps>
清单8. USERS_MAP表的缓存映射
<Map name="USERS_MAP">
<Entry key="ID1$;$NAME1">
<![CDATA[<IBMDEV.USERS_MAP><PRIMARY_KEY_1>ID1</PRIMARY_KEY_1><PRIMARY_KEY_2>NAME1</PRIMARY_KEY_2><ID>ID1</ID>
<ADDRESS>ADDRESS1</ADDRESS><PHONE_NUMBER>PHONE1</PHONE_NUMBER><STATE>STATE1</STATE></IBMDEV.USERS_MAP>]]>
</Entry>
......
<Entry key="ID7$;$NAME7">
<![CDATA <IBMDEV.USERS_MAP><PRIMARY_KEY_1>ID7</PRIMARY_KEY_1><PRIMARY_KEY_2>NAME7</PRIMARY_KEY_2><ID>ID7</ID>
<ADDRESS>ADDRESS7</ADDRESS><PHONE_NUMBER>PHONE1</PHONE_NUMBER><STATE>STATE7</STATE></IBMDEV.USERS_MAP>]]>
</Entry>
</Map>

应用程序可以通过调用ESQL过程ExtractXMLValues来访问CDATA XML格式的缓存,如清单9所示。

清单9.用于访问CDATA XML格式的缓存的ESQL过程
CREATE PROCEDURE ExtractXMLValues(IN rInCache REFERENCE, IN rOutCacheFields REFERENCE ) RETURNS BOOLEAN
BEGIN
	DECLARE cMapName, cKey, cMainFieldName	CHARACTER;
	DECLARE cMainFieldValue,cFieldName		CHARACTER;
	DECLARE bFound					BOOLEAN	FALSE;
	DECLARE rOutTmp, rTmp1			REFERENCE TO rOutCacheFields;
	DECLARE	rOutCache			REFERENCE TO OutputRoot;
			
	SET 	cMapName 	= rInCache.MapName;
	SET 	cKey	 	= rInCache.Key;
	SET	cMainFieldName	= rInCache.MainField;
		
	IF (cMapName || cKey || cMainFieldName ) IS  NULL THEN
		RETURN FALSE;
	END IF;
		
	CREATE LASTCHILD OF rOutTmp AS rOutCacheFields NAME 'CACHE';
	SET bFound = CacheLib.getCacheCDATAValue(cMapName,cKey, cMainFieldName ,rOutTmp,cMainFieldValue);	

	IF 	bFound IS TRUE THEN
		CREATE LASTCHILD OF OutputRoot AS rOutCache DOMAIN('XMLNSC');
		CREATE LASTCHILD OF rOutCache AS rOutCache NAME 'CacheOutput';
				
		SET rOutCache.MapName 		=	cMapName;
		SET rOutCache.Key 		=	cKey;
		SET rOutCache.MainField 	=	cMainFieldValue;
			
		CREATE LASTCHILD OF rOutCache AS rOutCache NAME 'OtherFields';
		MOVE rTmp1 TO rOutTmp.CDATA.XMLNSC.*[1];
	
		IF NOT LASTMOVE(rTmp1) THEN
			RETURN FALSE;
		END IF;
				
		MOVE rTmp1 FIRSTCHILD;
				
		FIELD_LOOP: WHILE LASTMOVE(rTmp1) DO
			SET cFieldName = FIELDNAME(rTmp1);
			IF CONTAINS(cFieldName, 'PRIMARY_KEY') THEN
				MOVE rTmp1 NEXTSIBLING;
				ITERATE FIELD_LOOP;
			END IF;
					
			SET rOutCache.{cFieldName} = FIELDVALUE(rTmp1);
			MOVE rTmp1 NEXTSIBLING;
		END WHILE FIELD_LOOP;
	END IF;		
END;

例如,应用程序可以调用ESQL过程ExtractXMLValues来搜索键= ID1$;$NAME1并检索列ADDRESS值和其他列值。

作为输入,该过程需要引用( rInCache )以:

  • MapName = users_map
  • 密钥= ID1$;$NAME1
  • MainField = ADDRESS

该过程返回( rOutCacheFields ):

  • MapName: users_map
  • 密钥: ID1$;$NAME1
  • MainField: ADDRESS1
  • OtherFields
  • 地址: ADDRESS1
  • PHONE_NUMBER: PHONE_NUMBER1
  • 州: STATE1

通过简单地指定列名,应用程序可以直接引用许多输出值,而无需重复访问缓存。 例如, rOutCacheFields.OtherFields.STATE返回rOutCacheFields.OtherFields.STATE

访问使用标记格式的缓存

对于具有许多列的表,CDATA XML缓存格式使用了太多空间。 对于每一列,缓存值字段将值和名称存储在XML标记中。 为了节省空间,一种解决方案是使用分隔符CACHE_TAG_SEPARATOR (无XML标签)来连接列值。 例如,假设使用清单10中的XML输入文件将表USERS_MAP (如表2所示)加载到缓存中。

清单10.用于加载USERS_MAP表的XML输入文件(标记格式)
<LoadMaps>
  	<LoadMap>
  		<MapName>USERS_MAP</MapName>
  		<TableName>IBMDEV.USERS_MAP</TableName>
  		<PrimaryKey>
  			<column>ID</column>
   			<column>NAME</column>
  		</PrimaryKey>
  		<TagData>
			<column>ID</column>
			<column>ADDRESS</column>
			<column>PHONE_NUMBER</column>
			<column>STATE</column>
  		</TagData>>
	 </LoadMap>
</LoadMaps>

清单11中显示了生成的缓存映射USERS_MAP

清单11. USERS_MAP表的缓存映射
<Map name="USERS_MAP">
<Entry key="ID1$;$NAME1">ID1$;$NAME1$;$ID1$;$ADDRESS1$;$PHONE1$;$STATE1</Entry>
........
<Entry key="ID7$;$NAME7">ID7$;$NAME7$;$ID7$;$ADDRESS7$;$PHONE1$;$STATE7</Entry>
</Map>

带标记的解决方案的缺点是应用程序只能通过其位置引用列值。 因此,如果一列更改了表中的位置,则必须更改ESQL代码以使用新索引。

应用程序可以调用ESQL过程ExtractTagValues来搜索键= ID1$;$NAME1并检索列ADDRESS值和其他列值(清单12)。

清单12.用于以标记格式访问高速缓存的ESQL过程
CREATE PROCEDURE ExtractTagValues(IN rInCache	REFERENCE, IN rOutCacheFields REFERENCE) RETURNS BOOLEAN
BEGIN

	DECLARE cMapName, cKey			CHARACTER;
	DECLARE iMainFieldPos			INTEGER;
	DECLARE cMainFieldValue,cFieldName	CHARACTER;
	DECLARE bFound				BOOLEAN		FALSE;
	DECLARE rOutTmp, rTmp1,rOutValue	REFERENCE TO rOutCacheFields;
	DECLARE	rOutCache									REFERENCE TO OutputRoot;
			
			
	SET 	cMapName 			= rInCache.MapName;
	SET 	cKey	 			= rInCache.Key;
	SET	iMainFieldPos			= rInCache.MainFieldPos;
			
	IF (cMapName || cKey || CAST(iMainFieldPos AS CHARACTER) ) IS  NULL THEN
		RETURN FALSE;
	END IF;
		
	SET bFound= CacheLib.getCacheTagValue(cMapName,cKey,iMainFieldPos,
		cMainFieldValue, rOutTmp); 			
	MOVE rOutTmp TO rOutTmp.*:DFDL.*:TaggedCacheValue;
			
	IF bFound IS TRUE THEN
		CREATE LASTCHILD OF OutputRoot AS rOutCache DOMAIN('XMLNSC');
		CREATE LASTCHILD OF rOutCache AS rOutCache NAME 'CacheOutput';
				
		SET rOutCache.MapName 		=	cMapName;
		SET rOutCache.Key 		=	cKey;
		SET rOutCache.MainField 	=	cMainFieldValue;
				
		CREATE LASTCHILD OF rOutCache AS rOutCache NAME 'OtherFields';
		MOVE rTmp1 TO rOutTmp;
	
		IF NOT LASTMOVE(rTmp1) THEN
			RETURN FALSE;
		END IF;
		MOVE rTmp1 FIRSTCHILD;
				
		FIELD_LOOP: WHILE LASTMOVE(rTmp1) DO
			CREATE LASTCHILD OF rOutCache AS rOutValue NAME 'Value';
			SET rOutValue = FIELDVALUE(rTmp1);
			MOVE rTmp1 NEXTSIBLING;
			END WHILE FIELD_LOOP;
		END IF;		
END;

作为输入,该过程需要引用( rInCache )以:

  • MapName = users_map
  • 密钥= ID1$;$NAME1
  • MainField = ADDRESS

该过程返回( rOutCacheFields ):

  • MapName: users_map
  • 密钥: ID1$;$NAME1
  • MainField: ADDRESS1
  • OtherFields
  • 值: ADDRESS1
  • 值: PHONE_NUMBER1
  • 值: STATE1

通过简单地指定列位置,应用程序可以直接引用许多输出值,而无需重复访问缓存。 例如, rOutCacheFields.OtherFields.Value[2]返回PHONE_NUMBER1。

删除缓存中的地图

要清除缓存映射,请使用命令mqsicacheadmin 。 以下命令清除高速缓存映射USERS_MAP:

mqsicacheadmin IB10NODE -c clearGrid -m USERS_MAP

样例应用

该示例代码包含两个消息流:

  • 消息流LoadGlobalCacheMap (在应用程序CACHE_LOADER ),用于从Oracle数据库加载缓存。
  • 用于访问缓存数据的消息流ReadCache (在应用程序CACHE_CLIENT_EXAMPLE)

有关代码和说明,请参见下载

图3中的消息流接收到一个WebSphere MQ消息作为输入,该消息指定了缓存映射名称( <MapName>字段),查询的复杂键( <Key>字段)以及要从中检索的主输出列名称。缓存值( <MainField>字段)。 如果找到了高速缓存映射,则消息流将创建具有所需值的输出文件。

图3.样本消息流ReadCache
样本消息流ReadCache

清单13显示了一个示例输入文件,用于从由文件夹<XMLCache>指定的以CDATA XML格式加载的缓存中提取数据。

清单13.用于提取以CDATA XML格式加载的数据的XML输入文件
<?xml version="1.0" encoding="UTF-8"?>
<Cache>	
	<XMLCache>
		<MapName>USERS_MAP</MapName>
		<Key>ID1$;$NAME1</Key>
		<MainField>PHONE_NUMBER</MainField>
	</XMLCache>
</Cache>

消息流ReadCache在映射USERS_MAPID1$;$NAME1相等的缓存键,并返回存储在缓存值中的所有列值。 清单14显示了输出消息。

清单14. ReadCache的输出消息
<CacheOutput>
 	<MapName>USERS_MAP</MapName>
 	<Key>ID1$;$NAME1</Key>
 	<MainField>PHONE1</MainField>
 	<OtherFields>
  		<ID>ID1</ID>
  		<ADDRESS>ADDRESS1</ADDRESS>
  		<PHONE_NUMBER>PHONE1</PHONE_NUMBER>
  		<STATE>STATE1</STATE>
 	</OtherFields>
</CacheOutput>

如果以标记格式(文件夹<TagCache> )加载缓存映射,则清单15中显示了消息流ReadCache的输入消息。

清单15. ReadCache的输入消息(标记格式)
<?xml version="1.0" encoding="UTF-8"?>
<Cache>
 <TagCache>
  <MapName>USERS_MAP</MapName>
  <Key>ID1$;$NAME1</Key>
  <MainFieldPos>2</MainFieldPos>
 </TagCache>
</Cache>

清单16显示了输出文件。

清单16. ReadCache的输出文件
<CacheOutput>
	 <MapName>USERS_MAP</MapName>
 	<Key>ID1$;$NAME1</Key>
 	<MainField>NAME1</MainField>
 	<OtherFields>
 		<Value>ID1</Value>
  		<Value>NAME1</Value>
  		<Value>ID1</Value>
  		<Value>ADDRESS1</Value>
  		<Value>PHONE1</Value>
  		<Value>STATE1</Value>
 	</OtherFields>
</CacheOutput>

结论

当应用程序访问数据时,IBM Integration Bus中的嵌入式全局高速缓存可以显着提高应用程序的性能。 本文介绍了如何在需要高可用性和复杂访问查询的企业环境中使用这种快速结构。 本文介绍了如何实现容错基础架构。 它显示了示例ESQL函数,用于加载和访问使用CDATA XML或标记格式的缓存数据。

翻译自: https://www.ibm.com/developerworks/websphere/library/techarticles/1604_necci-trs/1604_necci.html

嵌入式qt 字体 缓存

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cuxiong8996/article/details/107155507

智能推荐

[附源码]计算机毕业设计JAVA流浪动物领养系统_社区宠物管理系统er图-程序员宅基地

文章浏览阅读994次。附源码]计算机毕业设计JAVA流浪动物领养系统项目运行环境配置:(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat。_社区宠物管理系统er图

一建市政务实-第一章-市政公用工程技术-2.城市桥梁工程-1.城市桥梁结构形式及通用施工技术_一建市政桥梁维护与改造施工技术-程序员宅基地

文章浏览阅读796次。桥梁是在道路线路遇到江河湖泊、山谷深沟以及其他线路(铁路公路)等障碍时,为了保持道路的连续性而专门建造的人工构造物。桥梁既要保证桥上的交通运行,也要保证桥下水流的宣泄、船只的通航或车辆的通行。_一建市政桥梁维护与改造施工技术

PTA 到底有多二,部分正确_pta部分正确-程序员宅基地

文章浏览阅读2.8k次。L1-017 到底有多二 (15 分)一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍。例如数字-13142223336是个11位数,其中有3个2,并且是负数,也是偶数,则它的犯二程度计算为:3/11×1.5×2×100%,约为81.82%。本题就请你计算一个给定整数到底有多二。输入格式:输入第一行给出一个不超..._pta部分正确

条件随机场Conditional Random Field,CRF、隐马尔可夫模型Hidden Markov Model,HMM、马尔可夫随机场、马尔可夫性质傻傻分不清楚?帮你理理关系_条件扩散模型 和 隐马尔科夫的区别-程序员宅基地

文章浏览阅读383次。条件随机场(Conditional Random Field,CRF)和隐马尔可夫模型(Hidden Markov Model,HMM)都是自然语言处理的基础模型,还有马尔可夫随机场什么什么的。我在初学的时候属于是被搞晕了。在讲CRF的时候还会提到马尔可夫随机场什么的,搞得我云里雾里。经过一段时间的学习,对这几个东西的区别有了一些认识。进行了一下简单的梳理,希望对大家理解有一些帮助。但我个人的理解多半有些瑕疵,希望大家能批评指正。了解相关的基础概念是区分的关键,不想看的可以直接跳转到区别其含义是,当一个随机_条件扩散模型 和 隐马尔科夫的区别

Linux NGINX 主备,Nginx负载均衡(主备)+Keepalived-程序员宅基地

文章浏览阅读652次。Nginx负载均衡器的优点:实现看弹性化操作的架构,压力增大的时候可以临时添加后端Web服务器;upstream具有负载均衡能力(默认使用轮询),可以自动判断下面的机器,并且自动踢出不能正常提供服务的机器;Keepalvied加Nginx监测脚本可保证单个nginx负载均衡器的有效性,避免单点故障系统两台Nginx:CentOS6.7 x86_64两台Web:Ubuntu 15.04 deskto..._nginx主备机地址

随便推点

简要描述服务器虚拟化四大特性,虚拟化的四大特性-程序员宅基地

文章浏览阅读3.9k次。大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。虚拟化的四大特性是:1、封装:虚拟机都保存在文件中,且可通过移动跟复制这些文件的方式来移动跟复制该虚拟机。2、相对于硬件独立:无需修改即可在任何服务器上运行虚拟机。3、隔离:在同一服务器上的虚拟机之间互相隔离,改变了之前单台物理机服务器只能挂以个应用的格局。即在一个物理服务器上可以同时运行N个操作系统,每个系统中部署以个应用,这些..._虚拟机的四个特征

windows下 git log 显示中文乱码_windows git设置lang-程序员宅基地

文章浏览阅读263次。windows下 git log 显示中文乱码1、添加环境变量LESSCHARSET = UTF-82、修改git目录下配置文件位置: C:\Program Files\Git\etc\profile添加export LANG=zh_CN.UTF-8export LESSCHARSET=utf-8可能修改其中一个就可以_windows git设置lang

一文搞定深度优先搜索(DFS)与广度优先搜索(BFS)【含完整源码】_dfs广度优先代码-程序员宅基地

文章浏览阅读3.3k次,点赞2次,收藏13次。写在前面:博主是一位普普通通的19届二本大学生,平时最大的爱好就是听听歌,逛逛B站。博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事,做自己以后不会留有遗憾的事,做自己觉得有意义的事,不浪费这大好的青春年华。博主写博客目的是记录所学到的知识并方便自己复习,在记录知识的同时获得部分浏览量,得到更多人的认可,满足小小的成就感,同时在写博客的途中结交更多志同道合的朋友,让自己在技术的路上并不孤单。目录: 1.深度优先搜索(DFS) 2. ._dfs广度优先代码

2024年华数杯国际赛A题:放射性废水处理建模 思路模型代码解析-程序员宅基地

文章浏览阅读1.1k次,点赞20次,收藏21次。2024年华数杯国际赛A题:放射性废水处理建模(Radioactive Wastewater from Japan)2011年3月,日本东海岸发生了地震,引发了福岛第一核电站事故,导致三个核反应堆熔毁,并在一场巨大海啸中冲毁了电站的冷却系统,核燃料产生融化的碎片。为了冷却熔化的核燃料,海水不断注入反应堆,导致大量放射性核素污染的冷却水。

字节 算法 面试,2024最新 计算机毕业设计项目推荐(源码(1),大佬分享开发经验-程序员宅基地

文章浏览阅读694次,点赞10次,收藏8次。这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。

【交换机路由命令】常用的交换机配置命令及路由器配置命令(软考常考知识点)_交换机配置路由器命令-程序员宅基地

文章浏览阅读3.8k次,点赞2次,收藏20次。交换机配置命令汇总,路由器配置命令汇总,常用的交换机配置命令及路由器配置命令,软考常见命令汇总_交换机配置路由器命令

推荐文章

热门文章

相关标签