memcached の実装を行い、オブジェクトを memcache に移動したことを確認しましたが、memcached からの取得に問題があります。したがって、私のアプリケーションでは (予約システムです) 検索して結果リストを取得できますが、ホテル、フライト、またはアクティビティを選択すると、memdown、memcach エラーと表示されます。私が使用したいくつかのコードと方法をリストしました。pls はこの問題を解決するのを手伝ってくれます。
私のアプリは Struts mvc ベースです。アクションファイルといくつかのjspファイルで以下の3つのメソッドを使用しました。以下のメソッドを使用して、識別されたオブジェクトを memcaching しました。
private RezSession rezSession = null;
//Moving identified objects to memcached server
private void setToCache(String attributeName, Object value,HttpServletRequest request) throws Exception {
rezSession = new RezSession();
rezSession.setAttribute(attributeName, value, request);
}
private Object getFromCache(String attributeName, HttpServletRequest request)throws Exception {
rezSession = new RezSession();
return (Object) rezSession.getAttribute(attributeName,request);
}
private void removeFromCache(String attributeName, HttpServletRequest request) throws Exception{
rezSession = new RezSession();
rezSession.removeAttribute(attributeName,request);
}
上記のメソッドは、以下にリストされている Rezsession メソッドにリダイレクトされます。AbstractSessionObject はインターフェースであり、2 つの Java クラスがそれを実装します。
- CacheSessionImplementer.java
- HttpSessionImplementer.java
RezSession.java メソッド:-
public void setAttribute(String key,Object value, HttpServletRequest request) throws Exception {
HttpSession session = request.getSession();
try {
//AbstractSessionObject abstractSessionObject = RezSessionFactory.getInstance().getAbstractSessionObject();
if("ResPkgSearchForm".equals(key))
logger.debug(">>> Setting +:- "+key + " Class:"+(value==null?null:value.getClass()));
AbstractSessionObject abstractSessionObject = RezSessionFactory.getInstance().getSessionSpacificInstance(session);
abstractSessionObject.setAttribute(request,key,value,null);
} catch (Exception e) {
e.printStackTrace();
logger.fatal("error from new setAttribute",e);
}
}
public Object getAttribute(String key, HttpServletRequest request) throws Exception {
HttpSession session = request.getSession();
try {
//AbstractSessionObject abstractSessionObject = RezSessionFactory.getInstance().getAbstractSessionObject();
AbstractSessionObject abstractSessionObject = RezSessionFactory.getInstance().getSessionSpacificInstance(session);
Object value = abstractSessionObject.getAttribute(request,key,null);
if("ResPkgSearchForm".equals(key))
logger.debug(">>> Getting +:- "+key + " Class:"+(value==null?null:value.getClass()));
return value;
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("MEMDOWN", "Y");
logger.fatal("error from new getAttribute",e);
}
return null;
}
public void removeAttribute(String key, HttpServletRequest request) {
HttpSession session = request.getSession();
try {
AbstractSessionObject abstractSessionObject = RezSessionFactory.getInstance().getSessionSpacificInstance(session);
abstractSessionObject.removeAttribute(request,key,null);
} catch (Exception e) {
e.printStackTrace();
logger.debug("error from new removeAttribute",e);
}
}
CacheSessionImplementer.java -- AbstractSessionObject の Memcache 実装者 :::: このメソッド Memcached から取得するために使用されます。以下のコード「public Object getAttribute(), CacheSessionImplementer.java」は、「public Object getAttribute(), RezSesion.java」から呼び出されます。
public Object getAttribute(HttpServletRequest request,String key,Object additionalParam) throws Exception{ SessionValueContainer sessionValueContainer = null; CacheResults cacheResults = null; String seqNo = ""; if (null != request.getParameter("seqNo") && !request.getParameter("seqNo").equals("") && !request.getParameter("seqNo").equalsIgnoreCase("null")) { seqNo = request.getParameter("seqNo"); } else if (null != request.getAttribute("seqNo")){ seqNo = request.getAttribute("seqNo").toString(); } String requestString = getRequestString(request.getSession().getId(),seqNo); Object value = getCachedValue(key,requestString); return value; }
ここで、EngineFactory はどのキャッシング エンジンを選択するかを選択しています。
private Object getCachedValue(String key, String requestString) throws Exception, InstantiationException, IllegalAccessException, ClassNotFoundException { Object value = get(key, requestString); if (value != null && value instanceof String) { String new_mem_key = (String) value; // logger.debug("key ~>"+key+" --new_mem_key ~>"+new_mem_key); if ("MEM".equals(((String) value).split("#")[0])) { logger.debug("value before------------->" + value);// --getting // values // correctly---1 value = factory.getCacheEngine(memCacheKey).getObject( new_mem_key);// value is ok and redirect to // EngineFactory---2 logger.debug("value After------------->" + value);// --getting // null for // value---3 if (value == null) { logger.debug("MEMCACH-ERROR"); throw new NullPointerException("MEMDOWN"); } } } return value; }
私の場合、ホテルまたはフライトまたはアクティビティを選択するときに、getCachedValue() メソッドで (上記の 1 つ)
logger.debug("value before------------->"+value);//-----------------------------getting values correctly---1
value = factory.getCacheEngine(memCacheKey).getObject(new_mem_key);//value is ok and redirect to EngineFactory---2
logger.debug("value After------------->"+value);//-------------------------------getting null for value---3
そのため、キャッシュから値を取得できません。I 私のアプリでは、セッションから memcached サーバーへの移動は問題ありませんが、getFromCache が動かなくなります。だから私は良い解決策を期待しています。ありがとうございました。