`

浅谈JAVA数据缓存

阅读更多

 

一般是采用HashMap来作为缓存的存储结构,但Java没有全局变量的概念,怎么保证缓存中的数据不被垃圾回收器收集,而造成数据的丢失呢?  
   
  请问一般的缓存是怎样保证数据的独立性(即脱离垃圾回收器)的?  

做一个判断,HashMap取不到值就到数据库里再读数据

 

系统第一次起来,或是第一次取数据后将数据  
  保存在一个static的Map里即可,凡是缓存的东西  
  总是经常用到的,所以一般是保持强引用,GC应该  
  会清理

(1)jive里面,是使用单态模式维护一个工厂实例,做为程序的入口,就是无论有多少个在线用户,都只要从该入口进入.在这个工厂实例中,有一个缓存管理类(DatabaseCacheManager)变量,这个类有几个公有变量,如DbUserCache(就是缓存访问过的用户)等.当要获取一个user的用户信息时,它就会先在DbUserCache中查找,如果找不到,那么就从数据库中读取,再放入缓存中.  
   
  ckwvip51@hotmail.com(联系我)

 

singleton模式:  
  public   class   DataCache   {  
          protected   static   final   HashMap   map   =   new   HashMap();   //   Cache   table  
   
          private   static   final   Object   lock   =   new   Object();  
          private   DataCache()   {}   //   防止在外部实例化  
          public   static   Object   getData(Object   key)   {  
                  Object   v   =   map.get(key);  
                  if   (v   ==   null)   {  
                        synchronized(lock)   {    
                        v   =   map.get(key);     //   Check   again   to   avoid   re-load  
                        if   (v   ==   null)   loadDataSource(key);    
                        v   =   map.get(key);   //   retrieves   data.  
                        }  
   
                  }  
   
                  return   v;  
                   
          }  
          /*  
            *Load   data   from   data   source.  
            */  
          protected   static   synchronized   void   loadDataSource(Object   key)   {  
                  Object   value   =   new   Object();   //   Load   value   from   data   source  
                  map.put(key,   value);  
          }  
  }

分享到:
评论
4 楼 wzju64676266 2010-03-09  
我所有的访问数据都会被缓存,那么什么时候清空呢?另外我访问的数据已经更改了,我如何去更
jinyanhui2008 写道
这样岂不是有个问题啊,就是我所有的访问数据都会被缓存,那么什么时候清空呢?另外我访问的数据已经更改了,我如何去更新新的数据呢?


楼主想表达的只是思路吧!真正的缓存没这么简单的,我写过一个通用数据缓存有1000多行代码,功能上还算可以,但还有很多 地方 需要改进的
3 楼 kukumaiwu 2009-11-20  
有个问题
java不存在全局变量么?
那global定义的是什么呢?
2 楼 jinyanhui2008 2009-09-01  
这样岂不是有个问题啊,就是我所有的访问数据都会被缓存,那么什么时候清空呢?另外我访问的数据已经更改了,我如何去更新新的数据呢?
1 楼 freedom616 2008-05-22  
受教了,非常感谢!

相关推荐

    缓存技术浅谈

    这篇“缓存技术浅谈”可能是一篇深入解析缓存概念、原理及应用的博客文章,结合PPT形式提供了更直观的理解。以下是根据标题和描述可能涉及的一些核心知识点: 1. **缓存基本概念**:缓存是一种存储技术,用于临时...

    缓存技术浅谈.zip

    在源码层面,开发者通常会使用各种编程语言提供的缓存库或框架,如Java中的Guava Cache、Spring Cache,Python中的Redis或Memcached客户端等。这些工具帮助开发者轻松地集成缓存功能,并提供了丰富的API来管理缓存...

    浅谈Android LruCache的缓存策略

    在Android开发中,缓存策略对于提升应用性能和用户体验至关重要,尤其是在处理大量数据或资源时。本文主要讨论了Android中的LruCache缓存策略,它是一种高效的内存管理机制,尤其适用于图片或者其他大对象的缓存。 ...

    浅谈Java的输入输出流

    为了提高读写效率,Java还提供了缓冲流`BufferedReader`和`BufferedWriter`,它们分别是对`InputStreamReader`和`OutputStreamWriter`的封装,能够缓存多次读写操作,从而减少磁盘访问次数。 - **BufferedReader**:...

    浅谈Java如何实现一个基于LRU时间复杂度为O(1)的缓存

    浅谈Java如何实现一个基于LRU时间复杂度为O(1)的缓存 本文主要介绍了如何使用Java实现一个基于LRU(Least Recently Used,最近最少使用)时间复杂度为O(1)的缓存。LRU缓存是一种常用的缓存策略,当缓存容量不足时,...

    浅谈Android轻量级的数据缓存框架RxCache

    在Android应用开发中,数据缓存是提升用户体验的关键技术之一,尤其在网络请求中,通过合理的缓存策略可以显著减少等待时间,提高应用响应速度。本文将深入探讨轻量级的数据缓存框架——RxCache,它利用RxJava进行...

    浅谈ORACLE数据库的性能优化.pdf

    数据缓冲区存储从数据文件读取的数据,日志缓冲区用于记录事务日志,而共享池则用于SQL和PL/SQL的解析、编译和执行,包括库缓存、数据字典缓存和用户全局区。 2. 初始参数调整 通过初始化参数如DB_BLOCK_SIZE可以...

    浅谈IBM AIX环境下的Java性能调优

    - **缓存对象**:缓存常用对象以减少垃圾收集。 - **JNI调用**:尽量减少Java本地接口(JNI)的使用,分组本地操作。 - **同步控制**:谨慎使用同步方法,减少多线程开销。 - **垃圾回收**:避免不必要的垃圾...

    浅谈SSH学习要点

    此外,事务管理和并发控制对于多用户环境下的数据一致性至关重要,而缓存机制则能提升查询速度。 最后,Spring框架,以其依赖注入(IoC)和面向切面编程(AOP)闻名。IoC使得对象间的依赖关系可以通过配置文件或...

    浅谈Java模板引擎性能对比

    Java模板引擎是Web应用程序中一个非常重要的组件,负责将数据绑定到模板中生成最终的HTML页面。不同的Java模板引擎具有不同的性能特点,因此选择合适的模板引擎对于Web应用程序的性能非常重要。 本文将对JSP、...

    浅谈JSON的数据交换、缓存问题和同步问题

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web应用程序之间传递数据。相较于XML,JSON解析速度快,占用的存储空间更小,因此成为开发者首选的数据交互格式。JSON格式遵循以下规则:...

    浅谈JAVA设计模式之享元模式

    "浅谈JAVA设计模式之享元模式" JAVA 设计模式中的享元模式(Flyweight Pattern)是一种结构型设计模式,主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式提供了减少对象数量从而改善应用...

    浅谈Java中的四种引用方式的区别

    软引用常用于实现缓存,如网页缓存和图片缓存,以便在内存紧张时自动释放资源。 - 示例代码: ```java SoftReference<String> sr = new SoftReference(new String("hello")); ``` 3. **弱引用(WeakReference)...

    浅谈java常量池

    在Java 6及更早版本中,字符串常量池位于永久代(PermGen Space),而在Java 7及以后版本,被移到了元数据区(Metaspace)或堆内存中。 ### 字符串常量池 字符串常量池在Java中具有特殊的地位,因为它涉及到字符串...

    浅谈Java自动装箱与拆箱及其陷阱

    Java中的自动装箱和拆箱是自JDK 1.5版本引入的一种语言特性,它极大地简化了基础数据类型(如int)与它们对应的包装类(如Integer)之间的转换过程。这一特性使得开发者无需手动创建包装类实例或使用显式类型转换,...

    浅谈Java并发中的内存模型

    总的来说,Java并发中的内存模型是一个复杂而关键的概念,它涉及到多线程环境下的数据同步和可见性问题,理解JMM有助于编写出高效且正确的并发程序。开发者需要了解并掌握这些机制,以保证程序在多核或多处理器系统...

    浅谈Spring Boot中Redis缓存还能这么用

    ```java @Cacheable(value = "c1", key = "#id") public User getUserById(Long id) { // 查询数据库并返回用户信息 } ``` 在这里,`value = "c1"`对应我们在配置中定义的缓存名称,`key = "#id"`表示缓存的键由...

    浅谈Java三大框架与应用

    Hibernate还支持事务管理和第二级缓存,提升了数据持久化的效率。在J2EE环境中,Hibernate可以替代CMP(容器管理持久性),为开发者带来更灵活、高效的数据库访问方式。 在实际应用中,三大框架通常协同工作:...

    浅谈JAVA设计模式之代理模式

    * 同步化(Synchronization)代理:Real Subject需要受到同步化,以确保数据的一致性。 * 智能引用(Smart Reference)代理:Real Subject需要受到智能引用的处理,以提高性能。 在实现代理模式时需要注意以下几点...

Global site tag (gtag.js) - Google Analytics