Hibernate Lazy Loading Issues

The N+1 Selects Problem

Solution:

  • 减少延迟映射:The best way of solving the N+1 selects problem is to keep your associations declared lazy by default, but override this behavior when you know the association is needed. JPQL LEFT JOIN FETCH
  • 批量:@BatchSize annotation makes loading multiple associations in one query.

Lasy Initialization Exceptions

发生于访问detached object的未初始化的属性,所以应确保在把domain object交给视图层之前初始化所需要的延迟关联和属性。不过,Spring提供了一些解决方案帮助我们能够在给视图层之前不必初始化lazy properties,这些方案都使用相同的解决方案:延迟EntityManager的关闭直到视图层完成渲染。

Spring提供了OpenEntityManagerInViewInterceptor拦截器来提供Open EntityManager In View pattern。

 

Caching

对于所有的domain objects, Hibernate提供了两个不同的缓存层次:

  • L1 cache: EntityManager提供,仅与某用户或请求的有限范围相关。主要目标是优化、避免对已经装载的domain object重复查询。
  • L2 cache: 范围是EntityManagerFactory,是个长寿的缓存。能够跨用户和请求来提供缓存。L2提供了最多的工具和灵活性来优化缓存。

所以,方向是激活L2 cache,并集成一个缓存provider来启动缓存。

Hibernate有多种方法缓存domain objects:Top-level domain object被缓存在不同的region。region本质上是一个不同的section或namespace,为了对每个实体进行分区,并且防止冲突。每个domain object按其identifier来缓存。所以,给定一个cache region和一个identifier,我们就可以访问某个domain object的数据。每个domain object的各自属性都被缓存了。

然而,domain object的引用和集合属性被独立缓存起来。domain object的缓存形式中仅保存这些引用的identifier。

 

结合一个Cache Implementation

推荐Ehcache。

配置Cache规则:

@Cache注解

posted @ 2013-01-30 01:00  Copyright  阅读(243)  评论(0编辑  收藏  举报