是否不扩展Spring就等于不能使用Hibernate的二级缓存

05-11-09 xuvin
最近看了一本夏昕他们编写的Hibernate编程指南,里面提到过:Query.list() 一次性读取所有记录,无法使用缓存;
Query.iterate() 分n条读取,每次读取一条,可使用缓存;
你再看看Spring的源代码,他的HibernateTemplate里面的所有方法都是用list()返回,那是否等于缓存就根本没使用过。
本想自己扩展Template,但我没认真研究过Spring,写了几行代码发现需要做的事太多了,而且不知道有没有用。
请高人指点,如果谁扩展过的,请贴出源码,谢谢。

zhangmingjing
2005-11-09 10:41
是否需要用到缓存要根据系统的实际情况决定。在spring中用hibernate可以采用自己定义的HibernateUtil打开关闭Session,不一定用spring中提供的。

banq
2005-11-09 11:08
Spring在缓存方面是低能儿,它几乎没有考虑缓存,大量使用New。

现在Spring+Hibernate组合,性能提升只能依靠Hiberante的粗粒度缓存提升性能,网上已经有人抱怨使用Hibernate之后批量查询性能低下的言论,并且建议关闭Hibernate缓存,因为缓存是智能的,需要根据业务需求定策略,Hibernate内置缓存在特定情况下变成性能阻碍,画蛇添足。
看看这个帖子:

http://www.jdon.com/jive/thread.jsp?forum=62&thread=22251
这种问题和以前Hibernate极端派别指责EJB CMP的毛病是一样的,他们指责CMP速度慢,非得使用DAO+JDBC,现在同样现象发生在他们支持的Hibernate上。

Spring Hibernate走的是纯设计主义思路,使用他们时,一样需要对他们原理深入掌握,否则又陷入另外一个陷阱。

不过,如果你不嫌麻烦的话,使用Hibernate的Open view方式,可以很好地使用他的缓存,不过你需要将Spring的Open view filter配置到web.xml中,事物都是一分为二,不要嫌麻烦啦。

猜你喜欢