延迟加载

来源:互联网 发布:网易新闻养猪场知乎 编辑:程序博客网 时间:2024/04/28 08:01

Spring默认是关闭session的,所以当我们需要使用延迟加载的时候就需要进行特殊的设置,有四种方法可以解决这个问题

1、 lazy=false 使用即时加载

2、 使用迫切外连接。

3、 使用声明式事物来完成,将需要延迟加载的数据在biz层中调用,即可得到数据。

4、 使用spring提供的OpenSessionInViewFilter来控制(推荐)

OpenSessionInViewFilter介绍

他的主要的功能就是延迟关闭hibernate的session。以一次请求为单位,请求过程中session绑定到线程里,请求结束后session关闭。

有个可配置的属性singleSession,是否在一次请求中使用一个session,默认是true。可以选择false,则只是延迟了session的关闭时间,对缓存性能的提升较小。

 

使用他的时候注意,在删除或者更新数据的时候可能会出现问题,

1、使用false属性值,则在删除数据的时候出现open two session的错误,是因为删除前取obj用的一个session,而删除的时候又用了另一个session,而第一个session中的obj还在缓存中,就报错误。不建议使用。

错误:org.hibernate.HibernateException: Illegalattempt to associate a collection with two open sessions

2、使用true属性值,则会报flush错误,是因为使用了一个session,删除前查询得到的数据obj在缓存中,而当删除前十不flush缓存的,所以报错。

错误:Turn your Session intoFlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition

解决方案是:

<init-param>

       <param-name>flushMode</param-name>

       <param-value>AUTO</param-value>

</init-param>

 

的查询方法

commit()方法

flush()方法

FlushMode.AUTO

清理

清理

清理

FlushMode.COMMIT

不清理

清理

清理

FlushMode.NEVER

不清理

不清理

清理

不过使用他时也有弊端,就是延迟加载会出问题。

 

最好的解决方法:声明式事务+OpenSessionInViewFilter来完成。

0 0