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注解

转载于:https://www.cnblogs.com/hotspot/archive/2013/01/30/2882298.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值