プログラム開発におけるキャッシュの設計
1496 ワード
開発では、データベース内のデータをメモリに保存し、クエリー時にデータベースに接続することなくメモリから直接検出するキャッシュが使用され、効率が向上します.
私はキャッシュをmapに設計して、エンティティオブジェクトを格納します.keyはこのクラスのidで、valueはこのエンティティオブジェクトの参照です.
次に、プログラムでこのキャッシュセットを直接使用して、次のような削除変更操作を行います.
しかしテストの時、いくつかの奇妙な問題が現れて、この集合はnullになりました...(クライアントコードはうっかりこの集合をnullに割り当てた)
コードを再確認した後、キャッシュ処理クラスを次の形式に変更しました.
キャッシュセットをprivate,finalに変更し、その参照アドレスを変更することはできません.また、キャッシュクラスはインタフェースを提供してプログラム呼び出しを提供します.
このような利点は、キャッシュセットが外部には見えないため、他のプログラムによって参照が変更されることを避けることができます.また、今後キャッシュの実装を変更したい場合は、ファイル形式を使用すると、クライアントの世代コードを変更することなく、現在提供されているインタフェースを引き続き使用することができます.
注意:キャッシュの処理方法はスレッドが安全です.
私はキャッシュをmapに設計して、エンティティオブジェクトを格納します.keyはこのクラスのidで、valueはこのエンティティオブジェクトの参照です.
public class Cache {
public static Map cmCacheMap = new HashMap();
}
次に、プログラムでこのキャッシュセットを直接使用して、次のような削除変更操作を行います.
Cache.cmCacheMap.put('key',new BaseBO);
しかしテストの時、いくつかの奇妙な問題が現れて、この集合はnullになりました...(クライアントコードはうっかりこの集合をnullに割り当てた)
コードを再確認した後、キャッシュ処理クラスを次の形式に変更しました.
public class Cache {
private static final Map cmCacheMap = new HashMap();
private final static String SIGN_STRING = "-";
/**
*
*
*/
public synchronized static void put(String id ,BaseBO bo) {
cmCacheMap.put(bo.getId(), bo);
}
/**
*
*
*/
public synchronized static void putAllBaseBOs(Map map) {
if(map != null) {
Cache.cmCacheMap.putAll(map);
}
}
/**
*
*/
public synchronized static boolean remove(String id) {
if (null != Cache.cmCacheMap.remove(id)) {
return true;
} else {
return false;
}
}
}
キャッシュセットをprivate,finalに変更し、その参照アドレスを変更することはできません.また、キャッシュクラスはインタフェースを提供してプログラム呼び出しを提供します.
このような利点は、キャッシュセットが外部には見えないため、他のプログラムによって参照が変更されることを避けることができます.また、今後キャッシュの実装を変更したい場合は、ファイル形式を使用すると、クライアントの世代コードを変更することなく、現在提供されているインタフェースを引き続き使用することができます.
注意:キャッシュの処理方法はスレッドが安全です.