【问题标题】:Avoid having a huge collection of ids by calling a DAO.getAll()通过调用 DAO.getAll() 避免拥有大量 id
【发布时间】:2010-04-08 11:38:19
【问题描述】:

我们不希望在调用 PersonDao.getAll() 时返回 List<Long> 的 ids,我们希望不在内存中拥有完整的 ids 集合。

似乎返回 org.springframework.jdbc.support.rowset.SqlRowSet 并迭代此行集不会将每个对象都保存在内存中。

这里唯一的问题是我无法将此行转换为我的实体。

有没有更好的方法?

通常我们希望对数据库中的每个人都执行一个方法

【问题讨论】:

    标签: java performance hibernate dao


    【解决方案1】:

    您可以使用ScrollableResults 来遍历结果集,并定期清除会话以处理不需要的对象。 Hibernate 书中的示例:

    ScrollableResults itemCursor = session.createQuery("from Item").scroll();
    int count=0;
    
    while ( itemCursor.next() ) {
      Item item = (Item) itemCursor.get(0);
      modifyItem(item);
      if ( ++count % 100 == 0 ) {
        session.flush();
        session.clear();
      }
    }
    

    有关更多示例和详细信息,请参阅the Hibernate reference

    【讨论】:

    • 很好的答案!除了冲洗和清理我害怕。我是否也希望将其用于其他正在运行的事务... StatelessSession 看起来最适合我。
    • @Michael 好点,我忘了说这应该在单独的事务中执行,而不是弄乱持久性上下文。但是 StatelessSession 也可以工作。
    • éter: 好的,但是当它在一个单独的事务中运行时,我认为 session.flush/clear 仍然会影响这个会话中的所有事务。
    • @Michael 哎呀,我的错。我的意思是 session 确实,不是交易 :-(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 2017-04-28
    • 1970-01-01
    • 2021-08-03
    • 2015-04-14
    相关资源
    最近更新 更多