首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >hibernate中的有效滚动: session.evict和session.clear对CacheMode.IGNORE

hibernate中的有效滚动: session.evict和session.clear对CacheMode.IGNORE
EN

Stack Overflow用户
提问于 2013-04-13 09:36:53
回答 2查看 2.6K关注 0票数 2

考虑一个典型的任务,当我们必须构建巨大的文件报告时,通过滚动来自DB的适当结果。ORM框架是Hibernate。我们知道,有三种方法,如何避免这种模式的OutOfMemoryException

  1. 使用session.evict(...): ScrollableResults customers = session.createQuery("from Customers order by id").scroll(ScrollMode.FORWARD_ONLY);while (customers.next()) { Customer customer = (Customer) customers.get(0);addDataToReport(customer);session.evict(customer);}
  2. 使用session.clear(): ScrollableResults customers = session.createQuery("from Customers order by id").scroll(ScrollMode.FORWARD_ONLY);int i= 0;while (customers.next()) { Customer = ( customer ) customers.get( 0);addDataToReport(customer);if ( ++i % 1000 == 0) session.clear();}
  3. 使用CacheMode.IGNORE: 客户= id").setCacheMode(CacheMode.IGNORE).scroll(ScrollMode.FORWARD_ONLY);( ScrollableResults customers =(客户) customers.get(0);addDataToReport ( Customer );}

因此,的问题是:就上述目的而言,这些方法中哪一种更好(从性能上说)?或者可能还有更有效的其他方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-13 09:51:39

  • CacheMode.IGNORE与您的问题无关。它大约是二级缓存,而不是会话缓存。
  • 如果没有CascadeType.DETACHCascadeType.ALL配置关系,则CascadeType.DETACH不会驱逐相关实体。意思是:
    1. 没有级联驱逐的相关实体将积累在内存中。
    2. 具有级联逐出的相关实体将在每次迭代中重新加载,即使

  • 使用clear()之前的方法是最好的选择:
    1. 调用时,它会将所有实体从会话缓存中清除出来。
    2. 它不会在每次迭代中调用,因此您可以利用相关实体的会话缓存。

票数 4
EN

Stack Overflow用户

发布于 2022-07-06 10:51:18

关于evict()StatelessSession

它们都可以优化内存使用,以防止将整个数据加载到内存中。

主要区别在于,evict()仍然可以从Hibernate特性中获益,如2级缓存、延迟加载等。

StatelessSession是Hibernate全功能禁用的方式.它依赖于JDBC,它提供了比evict()更好的内存优化,但更适合只读场景(因为StatelessSession方式中的实体需要程序员显式维护)。

在使用它们中的任何一个时,程序员在处理实体的状态、刷新时间、连接和事务创建以及它们的生命周期等时都需要小心。

有关更多细节,请参见以下博客:https://dzone.com/articles/bulk-fetching-hibernate

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15986374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档