Hibernate lazy load
2016-05-04 23:04
225 查看
项目中使用了很多many-to-one的映射,刚开始的时候不加lazy=false会报这个错误
加上lazy=false确实没有报错了,但是后来做性能测试的时候确确实实为此感到羞耻,因为每次都会有很多无用的sql执行。
下定决心去掉lazy=false,Spring提供了OpenSessionInViewInterceptor和OpenSessionInViewFilter这两种方式实现这个解决方案。其实是一回事,只不过一个是配置在web.xml里面一个是当作bean来配置。但是这种方法性能存在争议。
后来发现在transaction的的声明上加上readOnly=true可以解决这个问题:
当然这是加在只读的方法上,需要加在service层,因为它只对当前声明的方法有效,如果实体对象被穿出这个方法则是不行的,看具体业务而定。
再后来发现,其实不加(readOnly = true)也行,但是要声明事务。我想这是保证在同一个session里面。
问题的症结就在于你的程序如何管理当前的session,这和你的事务传播机制有关,如果能够保证这个对象一直在同一个Session中则没有问题。
非要把这个对象传出当前session的时候怎么办呢?可以借用Hibernate的初始化方法,手动进行初始化:
Hibernate的使用很多时候要看具体业务去采取优化的方式,了解源码懂得它的原理就不怕不知道怎么用了。
could not initialize proxy - no Session
加上lazy=false确实没有报错了,但是后来做性能测试的时候确确实实为此感到羞耻,因为每次都会有很多无用的sql执行。下定决心去掉lazy=false,Spring提供了OpenSessionInViewInterceptor和OpenSessionInViewFilter这两种方式实现这个解决方案。其实是一回事,只不过一个是配置在web.xml里面一个是当作bean来配置。但是这种方法性能存在争议。
后来发现在transaction的的声明上加上readOnly=true可以解决这个问题:
@Transactional(readOnly = true)
当然这是加在只读的方法上,需要加在service层,因为它只对当前声明的方法有效,如果实体对象被穿出这个方法则是不行的,看具体业务而定。
再后来发现,其实不加(readOnly = true)也行,但是要声明事务。我想这是保证在同一个session里面。
问题的症结就在于你的程序如何管理当前的session,这和你的事务传播机制有关,如果能够保证这个对象一直在同一个Session中则没有问题。
非要把这个对象传出当前session的时候怎么办呢?可以借用Hibernate的初始化方法,手动进行初始化:
Hibernate.initialize(proxy);
Hibernate的使用很多时候要看具体业务去采取优化的方式,了解源码懂得它的原理就不怕不知道怎么用了。
相关文章推荐
- android对话框介绍
- JQuery中图片自动切换和手动切换
- UVA 11039 Building designing
- Java Web基础知识之文件下载:当你下载文件的时候到底发生了什么?
- Kingston KVR编号的含义
- Hive 基础之:分区、桶、Sort Merge Bucket Join
- 如果有人问你数据库的原理,叫他看这篇文章
- hdu——1711Number Sequence(kmp专练)
- 多态的基础知识总结
- JavaScript 详说事件机制之冒泡、捕获、传播、委托
- ImageView的属性android:scaleType作用
- Apache Maven项目提供的EAR插件详解
- 【22】-快速排序随机选择元素的优雅解法
- 【22】-快速排序随机选择元素的优雅解法
- 【22】-快速排序随机选择元素的优雅解法
- Android定时器之Handler的postDelyed方法
- 关于java中文乱码问题,我有话要说。
- android坐标
- Go语言开发环境搭建for Windows
- 作业六:团队项目——编写项目的Spec