大家一起来研究一下url中加入new Date()参数的一定程度上防止数据缓存的原理

黑暗浪子 2014-12-20 03:54:04
项目中经常遇到缓存问题,而且经常可以在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浏览器,我太明白为什么要添加这个参数,这个参数的原理又是什么?
...全文
501 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
 $.ajax({
    url : 'url',
     dataType : "xml",
     cache: true,
     success : function(xml, status){    
             }
 });
其中这个cache就是设置更不更新缓存 ,或者 常用的,也是在url后面加一个随机变量,这些都是避免缓存的方式
黑暗浪子 2014-12-22
  • 打赏
  • 举报
回复
引用 8 楼 shijing266 的回复:
浏览器有自带缓存机制的,就像ajax也有一个属性来专门来设置 更不更新缓存,设置一个new Date();基本上就相当于重新请求了,肯定缓存更新了
您说的ajax缓存机制是?这个还真的第一次接触,大牛能细说一点吗?
黑暗浪子 2014-12-22
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
在 url 中加入 new Date() 就使得 url 总是与上次的不同(当然时间也有个精度问题) 此时,即使浏览器设置为优先读取缓存的话,由于 url 总是不同,缓冲区也就总是找不到的。于是就去访问服务器了 其实你也可以主动地在服务端发送禁止浏览器缓存的头,这样的话 url 不会被浏览器缓存,自然就总是能得到最新的数据了
大牛举哥例子,在服务器端发送禁止浏览器缓存的头,是在response里面设置吗?还是说,在页面通过meta来设置,我估计这两种方式可以,但具体实现方法,还没琢磨呢,能举哥例子不?
  • 打赏
  • 举报
回复
浏览器有自带缓存机制的,就像ajax也有一个属性来专门来设置 更不更新缓存,设置一个new Date();基本上就相当于重新请求了,肯定缓存更新了
liangtu 2014-12-22
  • 打赏
  • 举报
回复
这是url的缓存,和hibernate无关。
xuzuning 2014-12-21
  • 打赏
  • 举报
回复
在 url 中加入 new Date() 就使得 url 总是与上次的不同(当然时间也有个精度问题) 此时,即使浏览器设置为优先读取缓存的话,由于 url 总是不同,缓冲区也就总是找不到的。于是就去访问服务器了 其实你也可以主动地在服务端发送禁止浏览器缓存的头,这样的话 url 不会被浏览器缓存,自然就总是能得到最新的数据了
xkxq2020 2014-12-21
  • 打赏
  • 举报
回复
就是说每次请求都是不同页面,不在从缓存中去取原来的页面,因为后面这个new Date()是不一样的,所以两次请求浏览器会当做不同的请求来处理,也可以用一个random()函数来骗过浏览器
黑暗浪子 2014-12-20
  • 打赏
  • 举报
回复
引用 2 楼 woshishui6501 的回复:
这个解决的应该是浏览器对于get请求的缓存问题
恩,长知识了
黑暗浪子 2014-12-20
  • 打赏
  • 举报
回复
引用 1 楼 littlebrain4solving 的回复:
1、关于为何new Date() 比如做一次查询aa.do?method=list,由于浏览器第一次访问这个地址的时候他会连接网络去远程访问你的list方法加载数据后进行缓存;换句话说他会把这个数据存在本地;你用JS AJAX第二次调用这个aa.do?method=list的时候,浏览器直接从本地缓存中获取之前加载好的数据,new Date()指的就是每次都从服务器去获取数据,从而越过缓存(因为浏览器的缓存你本身很难进行控制,这是由客户端去决定的事情。) 2、关于Hibernate 对于你指的Hibernate一级缓存的机制,根据你的描述来分析;它很有可能也是采用URL的方式进行甄别;如果是这样,那你使用new Date()的方式还不如关闭一级缓存,如果需要共存二种情况,使用后端的过滤URL手段进行控制一级缓存也未尝不可。
果然是高手,原来是浏览器本身有个list
西门呀在吹雪 2014-12-20
  • 打赏
  • 举报
回复
这个解决的应该是浏览器对于get请求的缓存问题
  • 打赏
  • 举报
回复
1、关于为何new Date() 比如做一次查询aa.do?method=list,由于浏览器第一次访问这个地址的时候他会连接网络去远程访问你的list方法加载数据后进行缓存;换句话说他会把这个数据存在本地;你用JS AJAX第二次调用这个aa.do?method=list的时候,浏览器直接从本地缓存中获取之前加载好的数据,new Date()指的就是每次都从服务器去获取数据,从而越过缓存(因为浏览器的缓存你本身很难进行控制,这是由客户端去决定的事情。) 2、关于Hibernate 对于你指的Hibernate一级缓存的机制,根据你的描述来分析;它很有可能也是采用URL的方式进行甄别;如果是这样,那你使用new Date()的方式还不如关闭一级缓存,如果需要共存二种情况,使用后端的过滤URL手段进行控制一级缓存也未尝不可。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧