问大家个spring+hibernate的小白级问题,某个对象中的属性配置了lazy=true以后,是不是这个对象只要被查询了就延迟加载它的这个属性?不管你用get(clazz,id) load(clazz,id) find(sql),对于懒加载session延迟关闭的问题,我不想使用OpenSessionInViewFilter那种垃圾的烂东西,有没有个既能提高保留延迟加载性能又可以不去延长session和事务周期的的解决方案?高手快现身指点我一下吧...........小弟冰天雪地原地360°打转光屁股坐地跪求了啊!!

解决方案 »

  1.   

    除了OpenSessionInViewFilter,还有什么呢
    研究下OpenSessionInViewFilter,造轮子吧
      

  2.   

    get方法是不适用延迟加载的,你只要调用get方法就会发出SQL语句
    而load的方法加载的是一个代理对象,是使用延迟加载的。。
    因此如果你编写的一个实体类,在加载的时候就是用get方法,但是
    这样有一个缺点,如果你写的实体类与别的实体类有关联的话,那么lazy=true
    还是会延迟加载的,到达web层的话,session已经关闭,因此在项目中好像都是
    配置OpenSessionInViewFilter,这个非常easy就只是在web.xml文件中配置
    一个过滤器就行,不知道为什么说是懒东西。用起来非常方便。。 如果你真不喜欢就用ThreadLocal吧。线程级的玩意。
      

  3.   

    找了一篇文章,里面贴了代码,你看下吧
    http://junyaxu.javaeye.com/blog/371264
      

  4.   

    OpenSessionInViewFilter真正比较严格很注意性能和安全的项目是不会使用它的,因为它会带来session周期过长以及事务的一些问题,这个时候如果并发过大,甚至很多用户占用着session不放,先不说占用内存是个问题了,数据库的连接它不能及时有效的释放,系统死掉了怎么办?还有内部是通过请求来过滤实现的,每个请求打开一个session一直到请求结束,response反回,它才关闭session,我在junit里面根本没法测试它,更要命的是,我们在web层去调用lazy="true"的对象时还会报session已经关闭的错误,有人说写个aop拦截一下,保持session打开,调用执行完再关闭,太麻烦了,诸位还有没更好的办法了??
      

  5.   

    哦 学习了
    不用OpenSessionInViewFilter的话  
    关注
      

  6.   


    想得挺周到,想象你做出来的 办公系统  CRM系统
    拿到现实生活中有多少人再用再来看这问题把。
    在中国就算大一点公司 ,那就几百人。。基本上不存在性能的问题
    况且现在硬件那么高级。。你就不要杞人忧天了 
    一般的OA系统也就几十到百来个人吧。。
      

  7.   

    junit测试是不依赖容器的 
    如果你只测试业务逻辑中的方法,web容器不用启动。。
    测试的时候 用 AbstractTransactionalSpringContextTests这个类
    是spring-test.jar包中的。它会帮你管理事务以及关闭session
    你放心写你的业务逻辑把。
      

  8.   

    1.会带来session周期过长以及事务的一些问题,这个时候如果并发过大,甚至很多用户占用着session不放,先不说占用内存是个问题了,数据库的连接它不能及时有效的释放,系统死掉了怎么办:
    你这里的session如果交给spring那么它就和当前线程作为一个变量、属性绑定在一起,如果当前线程结束,spring就会负责把session关闭,所以不会存在不能及时释放的情况。
    2.更要命的是,我们在web层去调用lazy="true"的对象时还会报session已经关闭的错误?
    你错啦,OpenSessionInViewFilter的主要功能是使每个请求过程绑定一个 Hibernate Session,即使最初的事务已经完成了,也可以在 Web 层进行延迟加载的操作。OpenSessionInViewFilter 过滤器将 Hibernate Session 绑定到请求线程中,它将自动被 Spring 的事务管理器探测到。说白了,OpenSessionInViewFilter 的作用就是在你的response响应页面延迟加载缓存对象时,保证当前session不关闭
      

  9.   


    我做的是银行项目还有保险项目,已经明确指出不能在系统中使用OpenSessionInViewFilter,我想知道不用它,我们懒加载的对象如何在session关闭之后被关联使用到的时候不报session已经关闭的错误?除此而外,是否能够找到更好的办法既能保证懒加载机制的正常使用,又不使用OpenSessionInViewFilter这种不安定机制带来的新的负面隐患!注:关于OpenSessionInViewFilter的缺点隐患,设计者本人也曾声明过,在一些大用户并发访问比较严重,安全性较高的项目中,是极力不推荐使用的,具体信息大家可以查阅相关资料:http://downpour.javaeye.com/blog/32001
      

  10.   

    用spring的事务管理功能可以很好的解决这个问题。
      

  11.   

    我也不想用 OpenSessionInView
    有没有好的解决方案啊