【问题标题】:Fast way to get results in hibernate?在休眠中获得结果的快速方法?
【发布时间】:2011-06-30 03:55:17
【问题描述】:

我目前在我的项目中设置了休眠。它适用于大多数事情。但是今天我需要一个查询从表中返回几十万行。它是表中总行数的约 2/3。问题是查询需要大约 7 分钟。使用直接 JDBC 并执行我认为是相同的查询,它需要

DetachedCriteria criteria  =DetachedCriteria.forlass(MyObject.class);
criteria.add(Restrictions.eq("booleanFlag", false));
List<MyObject> list = getHibernateTemplate().findByCriteria(criteria);

关于为什么它会变慢和/或我可以做些什么来改变它的任何想法?

【问题讨论】:

    标签: java oracle hibernate


    【解决方案1】:

    您可能已经回答了自己的问题,请直接使用 JDBC。

    Hibernate 最多为每一行创建一些 Object 的实例,或者更糟的是,为每一行创建多个 Object 实例。 Hibernate 有一些非常退化的代码生成和实例化行为,这些行为可能难以控制,尤其是对于大型数据集,如果您启用了任何缓存选项,情况会更糟。

    Hibernate 不适合大型结果集,并且将数十万行作为对象处理也不是非常注重性能。

    原始 JDBC 就是行列的原始类型。数据量少几个数量级。

    【讨论】:

    • 我只是不确定hibernate是否有能力做到这一点,我只是使用不正确。感谢您相信直接 JDBC 将是合适的解决方案。
    【解决方案2】:

    如果您需要提取数十万条记录,我不确定使用 hibernate 是否正确。查询执行时间可能不到 20 秒,但获取时间会很长并且会消耗大量内存。得到所有这些记录后,如何输出它们?它比您可以向用户显示的数据要多得多。对于进行数据仓库式数据处理而言,Hibernate 并不是一个很好的解决方案。

    【讨论】:

      【解决方案3】:

      可能您在 MyObject 类和映射中设置了预加载或类似的东西对其他类的多个引用。使用您编写的代码很难找到问题,因为没关系。
      使用 Hibernate Profiler - http://hibernateprofiler.com/ 可能会更好。它将向您展示您的映射、配置和查询的所有问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-24
        • 2015-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多