【问题标题】:Hibernate - get ScrollableResults from DAO in Service LayerHibernate - 从服务层中的 DAO 获取 ScrollableResults
【发布时间】:2016-08-18 11:40:24
【问题描述】:

在某些情况下,我需要读取数据库表的所有行以进行批处理。对于与 db 的通信,我使用 DAO。所以在服务层我可以做类似dao.getAll()的事情。为此,我需要从 dao 返回每一行 db。如果出现“内存不足错误”,我无法返回包含所有实体的 List,因为表非常大。分页不是一个好的解决方案,因为它会导致多次数据库调用。 所以有一个叫做ScrollableResults 的东西,它允许我滚动浏览所有实体并处理每一行而不会溢出内存。由于我使用的是 DAO,我必须将每一行从 DAO 返回到服务层。我怎样才能做到这一点?是否有其他解决方案可以解决此问题?我正在使用带有嵌入式 Derby 数据库的 Hibernate。

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    这也可以使用查询界面和条件来完成..

    Query query = session.createQuery(query);
    query.setReadOnly(true);
    query.setFetchSize(Integer.MIN_VALUE);
    ScrollableResults results = query.scroll(ScrollMode.FORWARD_ONLY);
    // iterate over results
    while (results.next()) {
        Object row = results.get();
        // process row then release reference
        // you may need to evict() as well
    }
    results.close();
    

    这里 Hibernate 仍然会在 Session 中缓存结果,所以你需要经常调用 session.evict() 或 session.clear()。

    当不需要缓存时,最好使用StatelessSession。

    ScrollableResults results = session.createQuery(query) .setReadOnly(true).setFetchSize( 1000 ).setCacheable(false).scroll(ScrollMode.FORWARD_ONLY)
    

    【讨论】:

    • 好的,但是这样做我会在处理结果时在我的 DAO 中拥有业务逻辑。这正是我想要避免的。我以为我可以在 DAO 之外得到结果并在另一个类中处理它们。这可能吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 2017-06-07
    • 2013-05-16
    • 1970-01-01
    • 2012-04-30
    • 2013-05-27
    相关资源
    最近更新 更多