论坛首页 Java企业应用论坛

hibernate 的 二级缓存 和 OpenSessionInViewFilter

浏览 3039 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (6) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-11-01  
有javaeye上的一篇文章http://www.iteye.com/topic/18904,写的真是不错,学到了很多的东西。
在使用的时候,我在web.xml中配置了OpenSessionInViewFilter,并且启动了二级缓存,但是,在方便的同时,还真的发现了很多的问题
1.我有一个Column类,其下有一个news集合,是一个一对多的关系,在Column端对news集合设置了reverse=true,用ecache配置了
<cache name="com.qinglin.model.Column.news"
maxElementsInMemory="500" eternal="false" timeToLiveSeconds="7200"
timeToIdleSeconds="3600" overflowToDisk="true" />


这样在新建一个news,并且setColumn(Column c)后,前台还真是没有及时的更新,引用上面仁兄的话,一个collection缓存仅在这个collection里面的元素有增删时才失效。而我在Column端对news集合设置了reverse=true,当然不会自动更新二级缓存中的集合news了,没办法,手动this.getSessionFactory().evictCollection("com.qinglin.model.Column.news",news.getCol_id()); ,清除集合news缓存。
2.仍旧是上面的一个例子,在news.xml中对日期这个属性
        <property name="add_date" type="java.util.Date" update="false">
            <column name="add_date" length="19">
                <comment>添加日期</comment>
            </column>
        </property>
这样,也在更新新闻这个类时出问题了,由于我在web.xml中设着了OpenSessionInViewFilter,且想更新完新闻后,接着显示出这条新闻,结果发现,session中竟然没有日期这一行,想了想,在edit(news)方法中加上了
news = (News)this.getHibernateTemplate().merge(news);
this.getSession().flush();
this.getSession().refresh(news);
这三句,第一句的得到的持久化对对象news没有add_date属性,第二句是为了向数据库中发送update的sql语句,更新数据库,由于设置了update=false,则数据库中的add_date不会失效,另外第三条语句是为了再从数据库中取出这个具有add_date属性的新闻,更新session缓存,为了在到达前台时能够正常的显示日期。


   发表时间:2008-11-04   最后修改:2008-11-04
二级缓存用不好反而会带来麻烦

用二级缓存是必须在很特殊的场合才用的,比如,数据基本不跟新或很少更新

你这样经常跟新数据,更新过后马上又要看见更新的内容,当然不适合二级缓存

这不是二级缓存和opensessioninview的问题,是你自己用的场合不对才搞得那么负责

不要为了技术而技术
0 请登录后投票
   发表时间:2008-11-08  
taupo 写道

二级缓存用不好反而会带来麻烦 用二级缓存是必须在很特殊的场合才用的,比如,数据基本不跟新或很少更新 你这样经常跟新数据,更新过后马上又要看见更新的内容,当然不适合二级缓存 这不是二级缓存和opensessioninview的问题,是你自己用的场合不对才搞得那么负责 不要为了技术而技术

其实并不常改数据库,发布新闻的人一天也就大量发布两三回,他又想立即看到效果,我感觉使用二级缓存是很好的。
0 请登录后投票
   发表时间:2008-11-08  
不知道阁下的代码是怎么玩的
0 请登录后投票
   发表时间:2008-11-08  
taupo 写道
二级缓存用不好反而会带来麻烦

用二级缓存是必须在很特殊的场合才用的,比如,数据基本不跟新或很少更新

你这样经常跟新数据,更新过后马上又要看见更新的内容,当然不适合二级缓存

这不是二级缓存和opensessioninview的问题,是你自己用的场合不对才搞得那么负责

不要为了技术而技术


二级缓存和数据库是同步的。

你所说的缓存,是squid缓存之类的页面级缓存。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics