Session没意义,Session是不能在多个会话之间共享的。Application还差不多。数据库可以,不过就会增加点代价,但好处是集群环境有效。一般来说这个缓存以 private static Set currentEditing; 就行了,注意控制并发。
貌似你5楼的回复被CSDN吃了。
受教了,向你看齐 public Class CheckStatus{ private static Set currentEditing=new HashSet(); public synchronized boolean checkSta(xx){ return CheckStatuc.currentEditing.add(xx) ; } }
但是你将面临一个问题:就是如果之前编辑的人,直接把编辑页面给 X 掉,你很难保证捕获到这样的信息从而删除缓存中正在编辑的这个状态。
1.通过session实现,但这种可能性能消耗较大
2.通过数据库实现:每次打开一个页面,改变当前记录的状态.
public Class CheckStatus{
private static Set currentEditing=new HashSet();
public synchronized boolean checkSta(xx){
return CheckStatuc.currentEditing.add(xx) ;
}
}
里面放个变量,然后判断一下
最后在页面中把Application拿出来就行了吧
2.缓存(private static Set currentEditing) 好处:简单 ;缺点:集群失效
3.数据库存储 好处:集群可用 ;缺点:性能消耗稍大;
不知我总结的有没有什么错的地方?另外还有个疑问,您提到了并发控制.我的程序不是多线程的,方法需要进行synchronized控制吗?
可以这么优化:
[code]
public Class CheckStatus{
private static Map<String, Integer> currentEditing=new HashMap<String, Integer>();
public static synchronized boolean checkAndSet(String id){
Integer counter = currentEditing.get(id);
if (counter == null) {
currentEditing.put(id, 1);
return true;
} else {
currentEditing.put(id, counter+1);
return false;
}
}
public static synchronized void leave(String id) {
Integer counter = currentEditing.get(id);
if (counter != null) {
if (counter > 1) {
currentEditing.put(id, counter-1);
} else {
currentEditing.remove(id);
}
}
}
public static synchronized int current(String id) {
Integer counter = currentEditing.get(id);
if (counter == null) {
return 0;
} else {
return counter;
}
}
}
[/code]
—— 比起static而言没那么简单;
2.缓存(private static Set currentEditing) 好处:简单 ;缺点:集群失效
—— 集群失效确实是最大问题
3.数据库存储 好处:集群可用 ;缺点:性能消耗稍大;
—— 是的另外还有一招,就是用MemCache之类的外置缓存组件,它们自己能实现集群。