`
qinglin876
  • 浏览: 13091 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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


分享到:
评论
4 楼 EXvision 2008-11-08  
taupo 写道
二级缓存用不好反而会带来麻烦

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

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

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

不要为了技术而技术


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

你所说的缓存,是squid缓存之类的页面级缓存。
3 楼 cys6736873 2008-11-08  
不知道阁下的代码是怎么玩的
2 楼 qinglin876 2008-11-08  
taupo 写道

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

其实并不常改数据库,发布新闻的人一天也就大量发布两三回,他又想立即看到效果,我感觉使用二级缓存是很好的。
1 楼 taupo 2008-11-04  
二级缓存用不好反而会带来麻烦

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

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

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

不要为了技术而技术

相关推荐

    hibernate面试题总结

    2. **Hibernate的一、二级缓存**: - **一级缓存**:每个`Session`对象都包含一个一级缓存,它是线程不安全的,用于存储在该`Session`生命周期内的对象。当`Session`关闭时,缓存中的对象也会被清除。 - **二级...

    Struts+Hibernate+Spring的基本流程

    例如,二级缓存的使用需要谨慎,以免造成内存泄漏或不必要的数据同步开销。 第三,Spring框架不仅提供了IoC容器,还引入了AOP,用于实现声明式事务管理。这意味着开发者无需在代码中显式处理事务边界,而是通过配置...

    struts2+hibernate+spring

    &lt;filter-class&gt;org.springframework.orm.hibernate3.support.OpenSessionInViewFilter &lt;!-- ExtremeTable Excel/PDF 导出过滤器 --&gt; &lt;filter-name&gt;eXtremeExport &lt;filter-class&gt;org.extremecomponents....

    JavaEE程序员简历最新版

    - **西安永兴科技发展有限公司内部管理系统**:在这个项目中,他使用了相同的Struts2+Spring+Hibernate技术栈,负责了岗位管理、部门管理等功能,并在权限管理上运用了Session的二级缓存优化和Struts的拦截器来实现...

    SSH框架整合所需类class.txt

    在Java EE开发领域中,SSH(Struts+Spring+Hibernate)是一种非常流行的轻量级Web应用开发框架组合。通过整合这三个框架,开发者可以构建出功能强大且易于维护的企业级应用系统。本文将围绕SSH框架整合过程中所需的...

    JavaEE---翟明明6500.doc

    5. **数据库管理**:翟明明熟悉MySQL和Oracle数据库,能进行数据库设计和优化,如使用二级缓存技术来提升性能。 6. **Linux操作系统**:熟悉Linux操作系统的常用操作,意味着他在部署和管理服务器方面有一定经验,...

    S2SH的配置

    # S2SH配置详解 ## 一、概述 在探讨S2SH配置的过程...通过这些配置,可以有效地集成Spring、Struts2和Hibernate三大组件,实现高效的数据访问和业务逻辑处理。同时,这些配置也为开发者提供了良好的扩展性和维护性。

    SSH框架整合小册子

    - **性能优化**:考虑使用二级缓存提高查询效率。 - **异常处理**:确保所有异常都能被妥善处理,避免程序崩溃。 - **安全性**:加强SQL注入等安全防护措施。 - **测试**:进行单元测试和集成测试,确保各部分功能...

    JavaEE技术面试常见问题.doc

    - **二级缓存**:可选的,用于跨会话的缓存。 7. **OpenSessionInViewFilter的使用** - 用于解决懒加载问题。 8. **Hibernate检索方式** - **HQL**:面向对象的查询语言。 - **Criteria**:灵活构建查询条件...

    Spring配置总结

    OpenSessionInView是一种技术,用于解决Hibernate在多线程环境下的一级缓存问题。通过在web.xml中配置`OpenSessionInViewFilter`,可以实现持久化层的事务与视图渲染的无缝结合,提高应用性能。 ##### 2. **Struts...

Global site tag (gtag.js) - Google Analytics