google 的appengine出新政策啦,真让人蛋疼,尤其是数据库读取率,一不小心就用完了
导致我的博客断断续续维持了几天,
突然有天看到徐明的博客上,有人说可以用缓存机制来减少数据库访问量
于是乎,翻天覆地的找信息
最终还是在google的官网上,看到缓存的用法
慢慢做了之后,发现效果还不错,
中途,还是遇到了不少麻烦,例如:cache中,不能直接放list数组,但是可以放单个对象和map
于是自己封装一下处理类,经过测试,还可以
在这里贴一部分代码出来,仅供参考
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.jsr107cache.Cache;
import net.sf.jsr107cache.CacheException;
import net.sf.jsr107cache.CacheFactory;
import net.sf.jsr107cache.CacheManager;
import com.google.appengine.api.memcache.MemcacheService;
import com.google.appengine.api.memcache.jsr107cache.GCacheFactory;
import com.google.choujone.blog.entity.User;
import java.lang.reflect.*;
/**
* choujone'blog
* 功能描述:缓存处理类 2011-11-9
* 官方地址:http://code.google.com/intl/zh-CN/appengine/docs/java/memcache/usingjcache.html
*/
public class MyCache {
public static Cache cache;
private static CacheFactory cacheFactory;
private static Map props = new HashMap();
//程序启动时,初始化缓存
static {
try {
props.put(GCacheFactory.EXPIRATION_DELTA, 3600);// 3600秒后过期
props.put(MemcacheService.SetPolicy.ADD_ONLY_IF_NOT_PRESENT, true);// 如果不存在具有该键的值,则添加该值;如果存在具有该键的值,则不执行任何操作
cacheFactory = CacheManager.getInstance().getCacheFactory();
cache = cacheFactory.createCache(props);
System.out.println("启动缓存");
} catch (CacheException e) {
System.out.println("初始化缓存失败!");
}
}
/**
* 获取缓存yoyo提供的代码
*
* @return
*/
public static Cache getCache() {
if (cache == null) {
try {
CacheFactory factory = CacheManager.getInstance()
.getCacheFactory();
cache = factory.createCache(Collections.emptyMap());
} catch (CacheException e) {
e.printStackTrace();
}
}
return cache;
}
/**
* 专门存放list数组
*
* @param
* @param list
*/
public static <T> void put(String key, List<T> list) {
Map<Integer, T> tmap = new HashMap<Integer, T>();
if (list != null) {
// 转换list为数组
Integer count = 1;
for (T t : list) {
tmap.put(count, t);
count++;
}
// 把数组放入缓存中
cache.put(key, tmap);
}
}
/**
* 取值(仅限于需要存list的地方)
*
* @param
* @param key
* @return
*/
public static <T> List<T> get(String key) {
Map<Integer, T> tmap = new HashMap<Integer, T>();
List<T> list = null;
tmap = (Map<Integer, T>) cache.get(key);
if (tmap != null && tmap.size() > 0) {
list = new ArrayList<T>();
for (Integer c : tmap.keySet()) {
list.add(tmap.get(c));
}
}
return list;
}
/**
* 更新缓存列表
* 作用:不用访问数据库,直接更新缓存,
* @param泛型对象
* @param key 存入缓存中的键
* @param entity 需要更新的对象
*/
public static <T> void updateList(String key, T entity) {
if (entity == null || key == null) {
return;
}
List<T> list = get(key);
List<T> newList=new ArrayList<T>();//重新定义一个数组,保存更改之后的内容
if (list != null && list.size() > 0) {
Long entiti_id = getId(entity);// 需要更新的内容
for (T t : list) {
Long id = getId(t);
if (id.equals(entiti_id)) {
newList.add(entity);
}else{
newList.add(t);
}
}
}
put(key, newList);// 放到缓存当中
}
/**
* 清理缓存 这个方法没有用,以后可能会重新写
*
* @return
*/
public static boolean refreshCache() {
boolean flag = false;
try {
cacheFactory = CacheManager.getInstance().getCacheFactory();
cache = cacheFactory.createCache(props);
flag = true;
} catch (CacheException e) {
System.out.println("清理缓存失败!");
flag = false;
}
return flag;
}
/**
* 获取编号
*
* @param
* @param t
* @return
*/
private static <T> Long getId(T t) {
Long id = -1L;
Class c = t.getClass();
try {
Method m = c.getDeclaredMethod("getId", new Class[] {});
id = (Long) m.invoke(t, new Class[] {});
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
&nbs