项目中经常遇到缓存问题,而且经常可以在url中添加一个new Date()参数,缓存问题得以解决,比如:
http://localhost:8080/demo/aa.action?date=new Date()
加入new Date参数可以很大程度上让hibernate去更新一级缓存,但是一直不明白,这个原理是什么?经常遇到的情况是,不加new Date()参数,hibernate一级缓存(也就是session所管理的内置的缓存)得不到更新
详细的描述:(基于SSH的框架)
表A,视图B,视图B的数据来源于很多表,包括表A
当我对表A进行增删改查的时候,我单独去查询表A,很显然,这个时候一般不会出现session缓存问题,基本上是与数据库同步的,因为我的增删改查都是对session中缓存操作的,与数据库的同步,这个是由session处理(好像是可以人工干预的)
但是问题就出在查询视图B上,B中的数据,在数据库中查询,已经得到更新了,但是查询B时,所使用的session管理的缓存,并没能得到更新,这个时候,我查询的数据依然是历史数据,不是最新的,但是url中添加了new Date()参数后,这个问题得到了解决,浏览器是IE浏览器,我太明白为什么要添加这个参数,这个参数的原理又是什么?
------解决思路----------------------
1、关于为何new Date()
比如做一次查询aa.do?method=list,由于浏览器第一次访问这个地址的时候他会连接网络去远程访问你的list方法加载数据后进行缓存;换句话说他会把这个数据存在本地;你用JS AJAX第二次调用这个aa.do?method=list的时候,浏览器直接从本地缓存中获取之前加载好的数据,new Date()指的就是每次都从服务器去获取数据,从而越过缓存(因为浏览器的缓存你本身很难进行控制,这是由客户端去决定的事情。)
2、关于Hibernate
对于你指的Hibernate一级缓存的机制,根据你的描述来分析;它很有可能也是采用URL的方式进行甄别;如果是这样,那你使用new Date()的方式还不如关闭一级缓存,如果需要共存二种情况,使用后端的过滤URL手段进行控制一级缓存也未尝不可。
------解决思路----------------------
这个解决的应该是浏览器对于get请求的缓存问题
------解决思路----------------------
在 url 中加入 new Date() 就使得 url 总是与上次的不同(当然时间也有个精度问题)
此时,即使浏览器设置为优先读取缓存的话,由于 url 总是不同,缓冲区也就总是找不到的。于是就去访问服务器了
其实你也可以主动地在服务端发送禁止浏览器缓存的头,这样的话 url 不会被浏览器缓存,自然就总是能得到最新的数据了
------解决思路----------------------
$.ajax({
url : 'url',
dataType : "xml",
cache: true,
success : function(xml, status){
}
});
其中这个cache就是设置更不更新缓存 ,或者 常用的,也是在url后面加一个随机变量,这些都是避免缓存的方式