首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

hibernate 的 二级缓存 跟 OpenSessionInViewFilter

2012-10-31 
hibernate 的 二级缓存 和 OpenSessionInViewFilter有javaeye上的一篇文章http://www.iteye.com/topic/189

hibernate 的 二级缓存 和 OpenSessionInViewFilter
有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缓存,为了在到达前台时能够正常的显示日期。


1 楼 taupo 2008-11-04   二级缓存用不好反而会带来麻烦

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

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

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

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

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

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

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

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

不要为了技术而技术

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

你所说的缓存,是squid缓存之类的页面级缓存。

热点排行