2009年2月26日 星期四

Hibernate的延迟加载,一个锋利的两面刀

老紫竹的文章

延迟加载是罪魁祸首,所谓“成也萧何,败也萧何”。

我有时发现查询速度很慢,检查才发现是我没有启用延迟加载,造成递归的数据都被加载进来了。

我如果加上了延迟加载,那么许多页面将无法使用,必须在程序里进行代码级别的递归的延迟加载数据的读取。

这里面涉及到的策略太麻烦了。

对于关联少,层次低的,用着没问题,一旦层次太多了,我宁可放弃面向对象,改用单纯的一个表,一个对象的策略,都保存字段就行了。

需要别的关联的数据,我宁可再次读取,毕竟有缓冲,速度影响不是很大的。而且单表的缓冲,性能绝对好。

还有对于 opensessioninview 这个东西,感觉上可以解决这个问题,但实际上,为了这是为了解决延迟加载而做出的一个愚蠢的决策。

对于使用量很小的,没啥可讨论的,怎么做都没关系,对于使用量大的

1 对于小数据量,我宁可让其非延迟加载,这样可以尽快的释放数据库资源,特别是一些锁。

2 对于大数据量,我想我们需要一个专门的类来保存操作结果,让其只返回我们需要的东西,而不是用什么延迟加载。比如我们一个订单查询,只用到了客户的名字,我们完全没有必要延迟加载客户的其它信息。

不同的需求,不同的技术,hibernate之类的ORM带给我们很多的方便,但我们千万不要认为其是”万金油“,在影响性能的关键地方,别忘了我们最基本的数据库操作。


Late load (延迟加载) 本身就是要看需求而決定的方式,沒有一種方式是走遍天下,這需要靠經驗才能做出好的設計,若是一招吃遍天下,軟體設計就沒有好玩的地方了。





沒有留言:

張貼留言