websphere清除缓存_在WebSphere Message Broker中使用全局缓存

本文详述了如何在WebSphere Message Broker中使用全局缓存以提高性能,包括通过XML文件维护静态数据,使用MQInput节点加载缓存,以及在ESQL和Java例程中访问缓存的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
图形数据图中的自定义ESQL

您还可以使用来自Mapping节点的自定义Java转换直接调用相应的Java例程:

图3.图形数据映射中的自定义Java
图形数据映射中的自定义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清除缓存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值