java后台数据库同步使用map进行缓存
2016-05-08 08:58
459 查看
几天在看ehcache的时候看到一个问答,里面回答的对我非常有帮助,这里摘抄一下
package com.cto.caches;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 缓存单例
* <a href="http://home.51cto.com/index.php?s=/space/1269642" target="_blank">@author</a> wangzp
*
*/
public class MapCache {
/**
* 缓存Map
*/
private static Map<String, String> cache;
private MapCache(){
if (cache == null){
cache = new ConcurrentHashMap<String, String>();
}
}
private static class MapCacheHandler{
private static MapCache instance = new MapCache();
}
public static MapCache getInstance(){
return MapCacheHandler.instance;
}
public void put(String key, String value){
cache.put(key, value);
}
}
package com.cto.caches;
/**
* 这里不具体实现,仅仅写个模式
* <a href="http://home.51cto.com/index.php?s=/space/1269642" target="_blank">@author</a> wangzp
*
*/
public class UserDao {
public void addUser(Object o){
/** 在你更新(添加、删除、修改操作中) **/
// super.save(o);
/** 完成了更新操作 ,将数据放置到缓存中,key和value来自于o中**/
MapCache.getInstance().put("", "");
// 这样的话,就达到了数据库操作完成之后,同步更新到缓存中
}
}
我写的比较简单,当然缓存仅仅用Map不用单例也是可以的;你首先要理解一点,就是缓存是数据java的,也就JVM管理的(当然也可以是其他的缓存机制),一般不外乎就是List、Set、Map,所谓的同步就是保持与元数据一致,你的元数据就是数据库数据,那么在数据更新操作完成之后,你把相应的数据,也映射到缓存中就实现了同步。
缓存一般做法:
1、一次查询(不要每次查询的结果都存放在Map中)
2、缓存更新(同步、异步)
3、防止内存泄漏,往往会定期更新缓存(即:清空缓存,重写导入数据到缓存中)
至于更加高级的缓存,例如Hibernate的自带缓存,或者第三方缓存,那就得根据人家的文档来了。
同步和异步:
1、同步:所谓的同步,以两个事务为例(A,B),假设B依赖于A,那么在A完成之后,B马上执行,所以你在数据库操作完成之后,应该马上处理缓存,保持数据一致;
2、异步:与同步相反,A完成了,可以延迟一段时间,或者交由其他方式调用(通知B)完成。
package com.cto.caches;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 缓存单例
* <a href="http://home.51cto.com/index.php?s=/space/1269642" target="_blank">@author</a> wangzp
*
*/
public class MapCache {
/**
* 缓存Map
*/
private static Map<String, String> cache;
private MapCache(){
if (cache == null){
cache = new ConcurrentHashMap<String, String>();
}
}
private static class MapCacheHandler{
private static MapCache instance = new MapCache();
}
public static MapCache getInstance(){
return MapCacheHandler.instance;
}
public void put(String key, String value){
cache.put(key, value);
}
}
package com.cto.caches;
/**
* 这里不具体实现,仅仅写个模式
* <a href="http://home.51cto.com/index.php?s=/space/1269642" target="_blank">@author</a> wangzp
*
*/
public class UserDao {
public void addUser(Object o){
/** 在你更新(添加、删除、修改操作中) **/
// super.save(o);
/** 完成了更新操作 ,将数据放置到缓存中,key和value来自于o中**/
MapCache.getInstance().put("", "");
// 这样的话,就达到了数据库操作完成之后,同步更新到缓存中
}
}
我写的比较简单,当然缓存仅仅用Map不用单例也是可以的;你首先要理解一点,就是缓存是数据java的,也就JVM管理的(当然也可以是其他的缓存机制),一般不外乎就是List、Set、Map,所谓的同步就是保持与元数据一致,你的元数据就是数据库数据,那么在数据更新操作完成之后,你把相应的数据,也映射到缓存中就实现了同步。
缓存一般做法:
1、一次查询(不要每次查询的结果都存放在Map中)
2、缓存更新(同步、异步)
3、防止内存泄漏,往往会定期更新缓存(即:清空缓存,重写导入数据到缓存中)
至于更加高级的缓存,例如Hibernate的自带缓存,或者第三方缓存,那就得根据人家的文档来了。
同步和异步:
1、同步:所谓的同步,以两个事务为例(A,B),假设B依赖于A,那么在A完成之后,B马上执行,所以你在数据库操作完成之后,应该马上处理缓存,保持数据一致;
2、异步:与同步相反,A完成了,可以延迟一段时间,或者交由其他方式调用(通知B)完成。
相关文章推荐
- Java学习·junit(单元测试框架)
- Java学习路线图
- 《java入门第一季》之面向对象(形式参数和返回值问题的深入研究3)
- 《java入门第一季》之面向对象(形式参数和返回值问题的深入研究3)
- javadoc生成出现错误“编码 GBK 的不可映射字符
- Javaweb的el操作
- JAVA设计模式之单例模式
- 一个实际问题分析及解决之六:java keystore的操作
- 一个实际问题分析及解决之四:通过IBM的JDK建立SSL连接
- SSM框架入门和搭建 十部曲
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- SSH框架总结(框架分析+环境搭建+实例源码下载)
- JavaMail基础知识
- “-Xmx1024m -Xms1024m -Xmn512m -Xss256k”——Java运行参数(转)
- JAVA学习总结六
- java web 100个知识点
- JAVA学习总结五
- 注释驱动的 Spring cache 缓存介绍
- 理解 Java GC(一)
- JavaMail 详解通俗易懂