Hibernate的延迟加载,一个锋利的两面刀
2009-02-26 15:35
337 查看
延迟加载是罪魁祸首,所谓“成也萧何,败也萧何”。
我有时发现查询速度很慢,检查才发现是我没有启用延迟加载,造成递归的数据都被加载进来了。
我如果加上了延迟加载,那么许多页面将无法使用,必须在程序里进行代码级别的递归的延迟加载数据的读取。
这里面涉及到的策略太麻烦了。
对于关联少,层次低的,用着没问题,一旦层次太多了,我宁可放弃面向对象,改用单纯的一个表,一个对象的策略,都保存字段就行了。
需要别的关联的数据,我宁可再次读取,毕竟有缓冲,速度影响不是很大的。而且单表的缓冲,性能绝对好。
还有对于 opensessioninview 这个东西,感觉上可以解决这个问题,但实际上,为了这是为了解决延迟加载而做出的一个愚蠢的决策。
对于使用量很小的,没啥可讨论的,怎么做都没关系,对于使用量大的
1 对于小数据量,我宁可让其非延迟加载,这样可以尽快的释放数据库资源,特别是一些锁。
2 对于大数据量,我想我们需要一个专门的类来保存操作结果,让其只返回我们需要的东西,而不是用什么延迟加载。比如我们一个订单查询,只用到了客户的名字,我们完全没有必要延迟加载客户的其它信息。
不同的需求,不同的技术,hibernate之类的ORM带给我们很多的方便,但我们千万不要认为其是”万金油“,在影响性能的关键地方,别忘了我们最基本的数据库操作。
我有时发现查询速度很慢,检查才发现是我没有启用延迟加载,造成递归的数据都被加载进来了。
我如果加上了延迟加载,那么许多页面将无法使用,必须在程序里进行代码级别的递归的延迟加载数据的读取。
这里面涉及到的策略太麻烦了。
对于关联少,层次低的,用着没问题,一旦层次太多了,我宁可放弃面向对象,改用单纯的一个表,一个对象的策略,都保存字段就行了。
需要别的关联的数据,我宁可再次读取,毕竟有缓冲,速度影响不是很大的。而且单表的缓冲,性能绝对好。
还有对于 opensessioninview 这个东西,感觉上可以解决这个问题,但实际上,为了这是为了解决延迟加载而做出的一个愚蠢的决策。
对于使用量很小的,没啥可讨论的,怎么做都没关系,对于使用量大的
1 对于小数据量,我宁可让其非延迟加载,这样可以尽快的释放数据库资源,特别是一些锁。
2 对于大数据量,我想我们需要一个专门的类来保存操作结果,让其只返回我们需要的东西,而不是用什么延迟加载。比如我们一个订单查询,只用到了客户的名字,我们完全没有必要延迟加载客户的其它信息。
不同的需求,不同的技术,hibernate之类的ORM带给我们很多的方便,但我们千万不要认为其是”万金油“,在影响性能的关键地方,别忘了我们最基本的数据库操作。
相关文章推荐
- 自己编写的一个Json工具类,实现了反射将整个Object转换为Json对象的功能,支持Hibernate的延迟加载对象[修订081217]
- 自己编写的一个Json工具类,实现了反射将整个Object转换为Json对象的功能,支持Hibernate的延迟加载对象
- 又一个因为延迟加载出现的错误Hibernate:could not initialize proxy - no Session
- 自己编写的一个Json工具类,实现了反射将整个Object转换为Json对象的功能,支持Hibernate的延迟加载对象
- 一个设置hibernate 延迟的加载的过滤器
- hibernate延迟加载的传说级错误org…
- Hibernate 的延迟加载【lazy】属性
- hibernate annotation方式实现属性级延迟加载
- Hibernate 延迟加载类属性
- hibernate复习4 延迟加载2--集合
- hibernate延迟加载的传说级错误org.hibernate.LazyInitializationException: could not initialize proxy - no Sessio
- 使用clone解决hibernate+spring集成中的延迟加载问题及分析(no session or session was closed)
- 解决Hibernate页面的延迟加载
- Hibernate性能优化 --- 延迟加载(懒加载)
- Hibernate 延迟加载(懒加载)与抓取策略
- 关于hibernate中的延迟加载和left join fetch
- hibernate延迟加载(get和load的区别)
- Hibernate延迟加载
- Hibernate 延迟加载剖析与代理模式应用
- hibernate 普通字段延迟加载无效的解决办法