代码之家  ›  专栏  ›  技术社区  ›  WW.

Hibernate适合批处理吗?内存使用情况如何?

  •  6
  • WW.  · 技术社区  · 16 年前

    我有一个日常批处理过程,包括选择大量记录并格式化文件以发送到外部系统。我还需要将这些记录标记为已发送,以便明天不再传输。

    以我天真的JDBC方式,我会准备并执行一条语句,然后开始循环遍历记录集。由于我只遍历记录集,因此我的应用程序服务器不需要一次将整个结果集保存在内存中。可以从数据库服务器馈送记录组。

    现在,假设我正在使用hibernate。我不会一次在内存中添加一堆代表整个结果集的对象吗?

    5 回复  |  直到 16 年前
        1
  •  5
  •   Aaron Digulla    16 年前

    Hibernate也会迭代结果集,因此内存中只保留一行。这是默认设置。如果它贪婪地装载,你必须告诉它。

    使用Hibernate的理由:

    • 列名中的“某人”具有“创造性”(PRXFC0315.XXFZZCC12)
    • DB设计仍在变化中,和/或您希望有一个列名映射到Java的地方。
    • 你仍然在使用Hibernate
    • 您有复杂的查询,并且不熟悉SQL

    原因 要使用Hibernate:

    • 应用程序的其余部分是纯JDBC
    • 你不需要Hibernate的任何功能
    • 您有复杂的查询,并且精通SQL
    • 您需要数据库的特定功能来执行SQL
        2
  •  3
  •   cretzel    16 年前

    Hibernate提供了一些保持会话小的可能性。

    您可以使用Query.scroll()、Criteria.scroll()进行类似JDBC的滚动。您可以使用Session.evic(对象实体)从会话中删除实体。您可以使用无状态会话来抑制脏检查。还有一些性能优化,请参阅Hibernate文档。

        3
  •  2
  •   Gennady Shumakher    16 年前

    Hibernate和任何ORM框架一样,旨在基于面向对象编程原理开发和维护系统。但大多数数据库都是关系型的,而不是面向对象的,因此在任何情况下,ORM都是方便的OOP编程和优化/最有效的数据库访问之间的权衡。

    我不会将ORM用于特定的孤立任务,而是将其作为应用程序持久层的总体架构选择。

        4
  •  1
  •   Gambrinus    16 年前

    在我看来,我会 不是 使用Hibernate,因为它会使你的应用程序变得更大,更难维护,而且你真的没有机会快速优化生成的sql脚本。 此外,您可以使用JDBC桥支持的所有SQL功能,而不限于休眠功能。另一件事是,每一层遗留代码都有局限性。

    但归根结底,这是一个哲学问题,你应该按照最适合你的思维方式去做。

        5
  •  0
  •   James Anderson    16 年前

    如果可能存在性能问题,请继续使用JDBC代码。

    有许多众所周知的纯SQL优化 这在Hibernate中很难做到。

    只选择您使用的列!(没有“选择*”的东西)。

    尽可能保持SQl的简洁性。例如,不要在连接中包含货币代码等小型参考表。相反,将货币表加载到内存中,并使用程序查找来解析货币描述。

    根据DBMS的不同,对SQL进行轻微的重新排序,谓词会对性能产生重大影响。

    如果你正在更新/插入,则只提交每100到1000次更新。也就是说,不要提交每一个工作单元,但要保留一些计数器,这样你就可以减少提交的频率。

    利用数据库的聚合功能。如果您希望按DEPT代码进行总计,请在SQL中使用“SUM(amount)…GROUP by DEPT”。