我们有一个使用 HashMaps 和同步加载方法的简单缓存机制。这是针对 WAS 8 应用程序服务器的。应用程序由几个在后台使用 JPA 的 Web 应用程序和 Web 方法组成。
从昨天开始,它运行良好,没有任何问题。但是遇到了严重的停机时间。原因是在一些 web 服务的高流量期间,发生了大量的 loadData 方法调用。我相信那时地图是空的,即使第一次调用加载地图,每次调用都试图执行 loaddata 方法。
我想到一个简单的解决方法是分别调用单独同步的每个加载方法。但最终我相信我们需要一个更好的解决方案,因为这只会减少再次发生这种情况的机会。
我知道有一些用于缓存的 api,并且愿意深入研究。但我相信有一个/一些没有 api 的好解决方案。
那么,您对这种情况有何建议?
编辑: loadData 方法仅在需要重新加载缓存时手动从 servlet 调用。
private static HashMap<String, Long> someObjectMap = new HashMap<String, Long>();
private static HashMap<String, Long> someAnotherObjectMap = new HashMap<String, Long>();
public synchronized static void loadData() {
loadSomeObjectMap();
loadSomeAnotherObjectMap();
// and some more methods similar, about 10 of them
}
//fill first map
public static void loadSomeObjectMap (){
someObjectMap = null;
try {
if (someObjectMap == null ) {
someObjectMap = new HashMap<String, Long>();
//fill someObjectMap here
}
} catch (Exception e) {
logger.error(Util.getStackTrace(e));
}
}
//fill second map
public static void loadSomeAnotherObjectMap (){
someAnotherObjectMap = null;
try {
if (someAnotherObjectMap == null ) {
someAnotherObjectMap = new HashMap<String, Long>();
//fill someObjectMap here
}
} catch (Exception e) {
logger.error(Util.getStackTrace(e));
}
}