技术标签: python java linux mysql 数据库
嵌入式qt 字体 缓存
企业应用程序可能需要经常访问保存在数据库或文件中的数据,从而对性能产生负面影响。 为了减少查询时间和使用的处理器资源量,可以将数据加载到缓存中。 IBMIntegration Bus V10提供了一个嵌入式全局缓存,该缓存在多个流之间共享,并部署在多个集成服务器和集成节点上。 这种快速的分布式缓存结构存储在集成服务器的JVM堆中。 当集成服务器发生故障或重新启动时,将清除缓存,并且所有存储的数据都将丢失。 对于需要高可用性缓存的企业解决方案,这种数据丢失是不可接受的。
全局缓存的另一个缺点是缓存结构,它由简单的键值对组成。 应用程序查找密钥,然后缓存返回一个值。 此基本方法仅适用于具有两列的数据库表,其中一列是唯一键,另一列是对应的值。 大多数企业应用程序必须访问复杂得多的数据,这些数据需要复杂的选择标准才能进行检索。 本文介绍如何为嵌入式全局缓存设计容错拓扑。 它显示了如何使用CDATA XML和标记格式将数据加载到缓存中,并提供了用于复杂查询的示例ESQL函数。
设计高可用性缓存时,请考虑以下概念和准则:
基于这些准则的示例设计解决方案由两个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管理。
在配置高速缓存之前,请安装和配置Linux系统和IBM Integration Bus节点(本文未涵盖)。
要配置缓存:
整合节点 | 类型 | 数量 目录服务器 |
整合伺服器 | 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所示。
<?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>
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"
mqsichangeproperties IB10NODE_CACHE02 -b cachemanager -o CacheManager -n policy –v "Cache_Policy_File.xml"
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
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.plugin
。 MbGlobalMap
对象表示嵌入式全局缓存中的地图实例。 它提供了查询和修改缓存键值对的方法: get
, update
和put
。
存在一些用于通过使用键值对访问来实现缓存的解决方案。 但是,这些解决方案仅限于具有两列的数据库表,其中一列是唯一键,另一列是对应的值。 请参阅相关主题的相关文章。 本文显示了用于企业应用程序所需的复杂访问和加载操作的ESQL函数。
考虑数据库表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对象MbGlobalMap
的put
和update
方法将数据库表加载到缓存映射中。 在示例消息流LoadGlobalCacheMap
,增强了这些方法,以便在缓存键和缓存值中加载更多数据库列值。 该流在应用程序CACHE_LOADER
定义。
图2中的消息流接收一个XML文件作为输入,该XML文件指定要在缓存中加载的表。 如果加载处理成功,那么该流程将使用加载的缓存映射内容或异常描述创建一个输出文件。
输入的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
中。
<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>
缓存键由数据库列ID
和NAME
,并且缓存值包含CDATA XML格式的数据库列ID
, ADDRESS
, PHONE_NUMBER
和STATE
。
还可以使用清单3中所示的XML输入文件,将表USERS_MAP
(模式IBMDEV
)以标记的格式加载到高速缓存映射users_map
中。
<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
在标记的格式。
<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)。
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或标记的)选择要加载到缓存中的表行和列。
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消息。 例如,如果使用清单7中的XML文件将表USERS_MAP
(如表2所示)加载到缓存中,则清单8中显示了生成的缓存映射USERS_MAP
。
<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>
<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所示。
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
)以:
users_map
ID1$;$NAME1
ADDRESS
该过程返回( rOutCacheFields
):
users_map
ID1$;$NAME1
ADDRESS1
OtherFields
: ADDRESS1
PHONE_NUMBER1
STATE1
通过简单地指定列名,应用程序可以直接引用许多输出值,而无需重复访问缓存。 例如, rOutCacheFields.OtherFields.STATE
返回rOutCacheFields.OtherFields.STATE
。
对于具有许多列的表,CDATA XML缓存格式使用了太多空间。 对于每一列,缓存值字段将值和名称存储在XML标记中。 为了节省空间,一种解决方案是使用分隔符CACHE_TAG_SEPARATOR
(无XML标签)来连接列值。 例如,假设使用清单10中的XML输入文件将表USERS_MAP
(如表2所示)加载到缓存中。
<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
。
<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)。
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
)以:
users_map
ID1$;$NAME1
ADDRESS
该过程返回( rOutCacheFields
):
users_map
ID1$;$NAME1
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>
字段)。 如果找到了高速缓存映射,则消息流将创建具有所需值的输出文件。
清单13显示了一个示例输入文件,用于从由文件夹<XMLCache>指定的以CDATA 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_MAP
与ID1$;$NAME1
相等的缓存键,并返回存储在缓存值中的所有列值。 清单14显示了输出消息。
<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
的输入消息。
<?xml version="1.0" encoding="UTF-8"?>
<Cache>
<TagCache>
<MapName>USERS_MAP</MapName>
<Key>ID1$;$NAME1</Key>
<MainFieldPos>2</MainFieldPos>
</TagCache>
</Cache>
清单16显示了输出文件。
<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 字体 缓存
文章浏览阅读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图
文章浏览阅读796次。桥梁是在道路线路遇到江河湖泊、山谷深沟以及其他线路(铁路公路)等障碍时,为了保持道路的连续性而专门建造的人工构造物。桥梁既要保证桥上的交通运行,也要保证桥下水流的宣泄、船只的通航或车辆的通行。_一建市政桥梁维护与改造施工技术
文章浏览阅读401次。获取股票历史数据_tushare查询股票往年数据
文章浏览阅读2.8k次。L1-017 到底有多二 (15 分)一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍。例如数字-13142223336是个11位数,其中有3个2,并且是负数,也是偶数,则它的犯二程度计算为:3/11×1.5×2×100%,约为81.82%。本题就请你计算一个给定整数到底有多二。输入格式:输入第一行给出一个不超..._pta部分正确
文章浏览阅读383次。条件随机场(Conditional Random Field,CRF)和隐马尔可夫模型(Hidden Markov Model,HMM)都是自然语言处理的基础模型,还有马尔可夫随机场什么什么的。我在初学的时候属于是被搞晕了。在讲CRF的时候还会提到马尔可夫随机场什么的,搞得我云里雾里。经过一段时间的学习,对这几个东西的区别有了一些认识。进行了一下简单的梳理,希望对大家理解有一些帮助。但我个人的理解多半有些瑕疵,希望大家能批评指正。了解相关的基础概念是区分的关键,不想看的可以直接跳转到区别其含义是,当一个随机_条件扩散模型 和 隐马尔科夫的区别
文章浏览阅读652次。Nginx负载均衡器的优点:实现看弹性化操作的架构,压力增大的时候可以临时添加后端Web服务器;upstream具有负载均衡能力(默认使用轮询),可以自动判断下面的机器,并且自动踢出不能正常提供服务的机器;Keepalvied加Nginx监测脚本可保证单个nginx负载均衡器的有效性,避免单点故障系统两台Nginx:CentOS6.7 x86_64两台Web:Ubuntu 15.04 deskto..._nginx主备机地址
文章浏览阅读3.9k次。大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。虚拟化的四大特性是:1、封装:虚拟机都保存在文件中,且可通过移动跟复制这些文件的方式来移动跟复制该虚拟机。2、相对于硬件独立:无需修改即可在任何服务器上运行虚拟机。3、隔离:在同一服务器上的虚拟机之间互相隔离,改变了之前单台物理机服务器只能挂以个应用的格局。即在一个物理服务器上可以同时运行N个操作系统,每个系统中部署以个应用,这些..._虚拟机的四个特征
文章浏览阅读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
文章浏览阅读3.3k次,点赞2次,收藏13次。写在前面:博主是一位普普通通的19届二本大学生,平时最大的爱好就是听听歌,逛逛B站。博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事,做自己以后不会留有遗憾的事,做自己觉得有意义的事,不浪费这大好的青春年华。博主写博客目的是记录所学到的知识并方便自己复习,在记录知识的同时获得部分浏览量,得到更多人的认可,满足小小的成就感,同时在写博客的途中结交更多志同道合的朋友,让自己在技术的路上并不孤单。目录: 1.深度优先搜索(DFS) 2. ._dfs广度优先代码
文章浏览阅读1.1k次,点赞20次,收藏21次。2024年华数杯国际赛A题:放射性废水处理建模(Radioactive Wastewater from Japan)2011年3月,日本东海岸发生了地震,引发了福岛第一核电站事故,导致三个核反应堆熔毁,并在一场巨大海啸中冲毁了电站的冷却系统,核燃料产生融化的碎片。为了冷却熔化的核燃料,海水不断注入反应堆,导致大量放射性核素污染的冷却水。
文章浏览阅读694次,点赞10次,收藏8次。这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。
文章浏览阅读3.8k次,点赞2次,收藏20次。交换机配置命令汇总,路由器配置命令汇总,常用的交换机配置命令及路由器配置命令,软考常见命令汇总_交换机配置路由器命令