【问题标题】:Hibernate criteria.setFetchSize is not working as expectedHibernate criteria.setFetchSize 未按预期工作
【发布时间】:2016-09-26 13:26:33
【问题描述】:

我正在努力提高性能。我们同时使用 Hibernate Criteria 和 Named Query 从数据库中检索数据。 在我们的应用程序中,我们从数据库中检索更多行并执行一些 Java 逻辑,因此我想一次从数据库中获取更多行以避免网络访问数据库。 由于 oracle 数据库的默认提取大小为 10,我已将其设置为 400 到标准对象,如下所示。

Criteria crit = getSession().createCriteria(Phone.class);
crit.setFetchSize(400);

我没有注意到响应时间有任何改善。 当我在 NamedQuery 上设置更高的提取大小时,我注意到了改进,如下所示。

Query query = session.getNamedQuery("getPhoneList");
query.setFetchSize(400);

关于crit.setFetchSize(400); 未按预期工作的任何建议。

【问题讨论】:

  • 您可以尝试使用 Wireshark 检查到 db 的 TCP 流量,例如,以尝试了解设置获取大小之前和之后发生的情况(了解如何,如果在所有,setFetchSize 影响“网络旅行”)。

标签: java hibernate


【解决方案1】:

我已经测试过这个问题,似乎crit.setFetchSize(400); 并没有限制返回的结果。但是,还有另一种有用的方法setMaxResults(int maxResults) 将限制从您的数据库返回结果。

看看来自 Hibernate API 的下一张图片:

我已将未执行明显请求行为的方法标记为红色,可能与红色矩形内的第二种方法有关。

看看绿色矩形,其方法会限制您从 DB 获得的结果:

Criteria crit = getSession().createCriteria(Phone.class).setMaxResults(400);
List<Phone> list = crit.list();

列表的最大大小为 400。

【讨论】:

  • setMaxResults(400) 将限制结果行的总数。我的要求是不限制结果行。数据库中的数据以块的形式返回到应用服务器(oracle 的默认大小为 10 行)。当我的查询返回大量行时,将有更多的网络访问数据库。我想将块大小设置为更高,例如 400,以便最大限度地减少网络访问数据库的次数。 setFetchSize() 应该以更大的块给出结果行,但我没有看到它在我的代码中按预期工作。
【解决方案2】:

以下帖子的答案也可以解释为什么 setFetchSize 不适用

What is difference between setMaxResults and setFetchSize in org.hibernate.Query?

他谈到数据库驱动程序的第二部分,jazzinthemorning 说:

"setFetchSize 并非由所有数据库驱动程序实现"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-03
    • 2021-06-04
    • 2022-01-24
    • 2015-05-11
    • 2020-05-15
    • 2014-10-31
    • 2018-02-12
    • 2014-01-20
    相关资源
    最近更新 更多