【问题标题】:Performance issues when calling MySQL stored procedure using Hibernate使用 Hibernate 调用 MySQL 存储过程时的性能问题
【发布时间】:2018-11-02 11:03:55
【问题描述】:

我试图理解为什么当我使用 Hibernate 从 Java 运行我的存储过程时,它的执行时间比我直接在 MySQL 中运行它时长得多。

存储过程本身负责将20000行从A表移动到B表,然后在A表中删除。

在 MySQL 中运行存储过程大约需要 18 秒。

在 Java 中,我使用 Hibernate 并创建一个查询:

Query query =
    mainSession
        .createSQLQuery("{CALL my_stored_procedure(:maxResultSize)}")
        .setParameter("maxResultSize", maxResultSize);

然后执行查询并刷新和清除会话:

List<BigInteger> rows = query.list();
mainSession.flush();
mainSession.clear();

这大约需要 248 秒。

有谁知道为什么使用 Hibernate 从 Java 调用存储过程需要这么多时间?

我应该采取什么方法来提高性能?

【问题讨论】:

  • 直接在 MySQL 中测试时,是否获取了所有行?
  • 我运行了相同的存储过程
  • 这并不一定意味着您的客户端获取了所有行,这有时会导致不同的性能特征。
  • 我可以测试一下吗?
  • 检查查询工具中的选项,它们通常有一个选项(在配置、菜单或查询屏幕本身)来获取几个页面或获取所有页面。

标签: java mysql database hibernate stored-procedures


【解决方案1】:

请您尝试使用本机查询,它对我来说更快并且效果很好。

List<Object[]> query = (List<Object[]>) mySessionFactory.getCurrentSession()
                .createNativeQuery("{CALL my_stored_procedure(:maxResultSize)}")
        .setParameter("maxResultSize", maxResultSize).getResultList();

【讨论】:

  • 嗯 Session.createSQLQuery 是 Hibernate 创建本机查询的方式。 Session.createNativeQuery 不存在。 createNativeQuery 是 JPA 创建本机查询的方式。请详细说明您的答案。
  • @RichardSilvertass ,我认为 hibernate 5.0 及更高版本不支持 createSQLQuery。它显示 deprecetation 。我们在 hibernate 5.0 中使用了 nativequery
  • 而createNativeQuery 不仅仅是createSQLQuery 的替代品?查询执行得更快?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-02
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 2013-12-21
  • 1970-01-01
相关资源
最近更新 更多