java后台数据库同步使用map进行缓存

来源:互联网 发布:男装批发软件 编辑:程序博客网 时间:2024/06/04 21:59

几天在看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)完成。

0 0
原创粉丝点击