websphere清除缓存
大多数企业IT解决方案都要求有在操作过程中经常访问的参考数据。 直到最近,该参考数据仍位于文件或数据库中,并且可以通过查询进行访问。 但是,查询文件或数据库会浪费时间,并且必须重复进行,这会严重影响性能。 为了克服此问题,应用程序开始将参考数据保存在内存中的缓存中,这大大减少了访问数据所需的时间。
IBM®WebSphere®Message Broker V8.0.0.1(以下称为Message Broker)提供了多种管理高速缓存的方法。 您可以在ESQL中使用共享变量将数据存储在内存中。 但是共享变量是消息流的私有变量,不能在消息流或执行组之间共享,这可能导致跨不同流重复存储的数据,并且对存储数据的内存要求更高。
或者,您可以将静态数据加载到执行组的JVM堆中,以便可以由部署在执行组中的多个流共享这些数据。 但是,使用这种方法,数据的使用仅限于该执行组。
Message Broker中的新全局缓存功能使消息代理应用程序可以将其参考数据存储在嵌入式或外部WebSphere eXtreme Scale网格中。 在嵌入式全局缓存中,对参考数据的访问分布在承载eXtreme Scale容器服务器的多个执行组中。 所有执行组都可以访问该数据,即使它们不参与托管容器服务器。 本文向您展示如何使用来自ESQL或Message Broker映射节点的Java例程维护和访问全局缓存中的静态数据。
维护参考数据
如上所述,可以在持久性存储中组织和维护参考数据,持久性存储可以是数据库或文件系统中的文件。 为简单起见,本文使用XML文件来组织和维护数据。 XML文件中的数据分为不同的类别,每个类别对应一个Map元素。 每个Map元素都有一个特定的名称,并包含一组逻辑键值对,如下所示:
清单1.用于维护静态数据的示例XML
<?xml version="1.0" encoding="UTF-8"?>
<Maps>
<Map name="Map1">
<Entry key="Key1">Value1</Entry>
</Map>
<Map name="Map2">
<Entry key="Key2">Value2</Entry>
<Entry key="Key3">Value3</Entry>
</Map></Maps>
将参考数据加载到缓存中
您可以在Message Broker流中使用适当的Input节点读取XML文件。 下面的样本流使用MQInput节点从WebSphere MQ队列中读取文件。 该流程解析文件,将数据加载到全局高速缓存中,并将确认消息写入输出WebSphere MQ队列:
图1.加载缓存消息流
使用Message Broker Java API与全局缓存进行交互。 Java类CacheUtil.java
提供了静态实用程序方法来添加和检索参考数据。 从ESQLCompute节点调用Java例程,以在全局缓存中插入或更新键值对。 这是ESQLCompute节点中的示例代码,用于将键值对加载到缓存中:
清单2.加载缓存的示例ESQL代码
DECLARE blnResult BOOLEAN TRUE;
DECLARE blnMapResult BOOLEAN;
DECLARE refMap REFERENCE TO InputRoot.XMLNSC.*[1];
MOVE refMap FIRSTCHILD;
WHILE(LASTMOVE(refMap)) DO
SET blnMapResult = addMapToCache(refMap);
IF blnMapResult = FALSE THEN
SET blnResult = FALSE;
END IF;
MOVE refMap NEXTSIBLING REPEAT TYPE NAME;
END WHILE;
该代码使用下面的ESQL例程:
清单3.加载映射的ESQL例程
CREATE PROCEDURE addMapToCache (IN refName REFERENCE)
RETURNS BOOLEAN
LANGUAGE JAVA
EXTERNAL NAME "Utilities.CacheUtil.addMap";
要访问缓存,请创建相应的ESQL例程:
清单4.从缓存中检索数据的ESQL例程
CREATE PROCEDURE getCacheValue(IN chrMapName CHARACTER, IN chrKey CHARACTER)
RETURNS CHARACTER
BEGIN
DECLARE chrResult CHARACTER;
SET chrResult = getCacheValueFromWXS(chrMapName,chrKey);
IF (TRIM(chrResult) IS NULL OR TRIM(chrResult) ='' ) THEN
THROW USER EXCEPTION MESSAGE 2999 VALUES('Failed to retrieve cache') ;
END IF;
RETURN chrResult;
END;
CREATE PROCEDURE getCacheValueFromWXS(IN chrMapName CHARACTER, IN chrKey CHARACTER)
RETURNS CHARACTER
LANGUAGE JAVA
EXTERNAL NAME "Utilities.CacheUtil.getValue";
ESQL包装器方法getCacheValue
调用ESQL例程getCacheValueFromWXS
以从缓存中检索数据,以便您可以根据是否成功获取值来进行自己的处理。 您可以从任何ESQLCompute节点或通过在Mapping节点中使用Custom ESQL转换来调用ESQL例程getCacheValue
。
图2.图形数据图中的自定义ESQL

您还可以使用来自Mapping节点的自定义Java转换直接调用相应的Java例程:
图3.图形数据映射中的自定义Java
Java例程访问缓存
下面的示例代码实现了静态Java方法来访问全局缓存:
清单5. CacheUtil.Java
package Utilities;
import com.ibm.broker.plugin.MbElement;
import com.ibm.broker.plugin.MbException;
import com.ibm.broker.plugin.MbGlobalMap;
public class CacheUtil {
/**
* Method to get a value from Global Cache using map name and key
*/
public static String getValue(String strMapName, String strKey) {
String strValue = null;
MbGlobalMap globalMap = null;
try
{
globalMap = MbGlobalMap.getGlobalMap(strMapName);
strValue = (String) globalMap.get(strKey);
}
catch(MbException mbe)
{
System.out.println(mbe.getMessage());
mbe.printStackTrace();
}
return strValue;
}
/**
* Method to add all the key-value pairs for a map in Global Cache
*/
public static Boolean addMap(MbElement elmMap) {
String strValue = null;
String strKey = null;
String strMapName = null;
MbGlobalMap globalMap = null;
try
{
elmMap = elmMap.getFirstChild();
strMapName = elmMap.getValueAsString();
globalMap = MbGlobalMap.getGlobalMap(strMapName);
MbElement elmEntry = elmMap.getNextSibling();
while (elmEntry != null) {
strKey = elmEntry.getFirstChild().getValueAsString();
strValue = elmEntry.getValueAsString();
if(globalMap.containsKey(strKey)) {
globalMap.update(strKey,strValue);
} else {
globalMap.put(strKey, strValue);
}
elmEntry = elmEntry.getNextSibling();
}
}
catch(MbException mbe) {
System.out.println(mbe.getMessage());
mbe.printStackTrace();
return Boolean.FALSE;
}
return Boolean.TRUE;
}
/**
* Method to add a key-value pair to a map in Global Cache
*/
public static Boolean addUpdateKey(String strMapName, String strKey, String strValue) {
MbGlobalMap globalMap = null;
try
{
globalMap = MbGlobalMap.getGlobalMap(strMapName);
if(globalMap.containsKey(strKey)) {
globalMap.update(strKey,strValue);
} else {
globalMap.put(strKey, strValue);
}
}
catch(MbException mbe) {
System.out.println(mbe.getMessage());
mbe.printStackTrace();
return Boolean.FALSE;
}
return Boolean.TRUE;
}
}
CacheUtil.java类中的Java方法摘要
表1. CacheUtil.java中的方法
修饰符和类型 | 方法 | 描述 |
---|---|---|
静态布尔 | addMap(MbElement elmMap) | 此方法从输入映射元素获取映射名称,并从全局缓存中获取给定名称的全局映射。 如果找到现有映射,则将来自输入映射元素的键值对添加到映射中(对于那些不存在的键),或者在映射中更新值(对于那些已经存在的键)。 参数: elmMap :地图元素 返回:布尔值如果所有键成功刷新,则为True,否则为False。 |
静态字符串 | getValue(String strMapName,String strKey) | 此方法从全局缓存中获取具有指定映射名称的映射,并从映射中返回与指定键关联的值。 参数 : strMapName :地图名称, strKey :要在该地图中查找的键 返回 :与映射中的键关联的值(如果存在),否则为null。 |
静态布尔 | addUpdateKey(String strMapName,String strKey,String strValue) | 此方法从全局缓存中获取给定名称的全局映射。 如果找到现有映射,则将给定的键值对添加到映射(如果不存在键),或者在映射中更新值(如果键已经存在)。 参数 : elmMap :地图元素 返回 :布尔值如果所有键成功刷新,则为True,否则为False。 |
结论
本文展示了在企业环境中存储和访问参考数据的新WebSphere Message Broker全局缓存功能的示例实现。 全局高速缓存在许多其他场景中很有用,并且您可以根据需要编写类似的ESQL和Java例程来访问全局高速缓存。
翻译自: https://www.ibm.com/developerworks/websphere/library/techarticles/1307_pal/1307_pal.html
websphere清除缓存