`

J2EE项目中缓存机制研究

    博客分类:
  • Java
阅读更多
基于B/S结构中的缓存方式,可以在不同的层次上进行。笔者比较粗略地从以下几方面就行分析:

       (1)浏览器缓存

       (2)单台服务器缓存(hibernate、ehcache等)

       (3)分布式系统中的缓存(memcache、xmemcached)





1 浏览器缓存
       本博前面一段时间在《Web前端优化》系列中分析了浏览器的工作行为,其中包括了一些浏览器缓存的因素。便于大家查看,现将文档列于下:

       WEB前端优化之内容篇

       Web 前端优化之CSS 篇

       Web 前端优化之 JavaScript

Web前端优化之Server

Web前端优化之图象

Web前端优化之Cookie

其中较多的参考了《高性能网站建设指南》一书.

另外推荐大家看一篇博文:《J2EE:web开发中的缓存问题的研究》http://www.diybl.com/course/3_program/java/javashl/20081130/152856.html。



2单台服务器缓存
       单台服务器的缓存机制现在有很多,主要有两种方式:一是采用自编程序实现、二是用现在开源的框架。具体的缓存机制按物理载体又可以分为内存级别的缓存和磁盘级别的缓存。按并发策略又可以分为:事务型(Transactional)策略、读写型(read-write)策略、非严格读写型(nonstrict-read-write)策略和只读型策略(read-only)。各种策略的详情这里也不多说了,感兴趣的可以再在网上找一下相关资料。下面分析一下这一级别常用的一些缓存机制。

2.1 hibernate+ehcache
Hibernate 中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存由hibernate管理的,一般情况下无需进行干预;第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存。这一级别的缓存可以进行配置和更改,并且可以动态加载和卸载。

Hibernate还为查询结果提供了一个查询缓存,它依赖于第二级缓存。

一级缓存

当应用程序调用Session的save()、update()、 savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在 Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中。当清理缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。

Session为应用程序提供了两个管理缓存的方法:

evict(Object obj):从缓存中清除参数指定的持久化对象。

clear():清空缓存中所有持久化对象。



二级缓存

Hibernate的二级缓存策略的一般过程:

1) 条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL语句查询数据库,一次获得所有的数据对象。

2) 把获得的所有数据对象根据ID放入到第二级缓存中。

3) 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。

4) 删除、更新、增加数据的时候,同时更新缓存。

Hibernate的二级缓存策略,是针对于ID查询的缓存策略,对于条件查询则毫无作用。为此,Hibernate提供了针对条件查询的Query Cache。

      

       至于详细的配置方式,大家可以上网去找吧。



2.2 自写原理
       自己写cache无非也是把数据存于内存或者磁盘的某个地方,但是自己写需要考虑到很多方面,如缓存更新策略、缓存访问策略等等,也都不是非常容易的。这里主要是利用Spring的相关机制实现缓存。

       原理如下:

1、 在开源工具如ehcache的基础上编写缓存工具类,实现缓存需要的基本操作

2、 然后实现函数的AOP拦截类,用来在函数执行前返回缓存内容

3、 配置Spring的AOP及其他的一些配置。



详细见《memcached的使用(一)》http://marc.iteye.com/blog/28700



3分布式系统中的缓存
       许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、网站显示延迟等重大影响。

这时就该memcached大显身手了。memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。、

目前,Java领域出现了xmemcached,它是基于java nio实现的memcached客户端API。

实际上是基于我实现的一个简单nio框架 http://code.google.com/p/yanf4j/的基础上实现的(目前是基于yanf4j 0.52),核心代码不超过1000行,序列化机制直接挪用spymemcached的Transcoder。

性能方面,在读写简单类型上比之spymemcached还是有差距,在读写比较大的对象(如集合)有效率优势。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics