【问题标题】:Slow Hibernate flush慢速休眠刷新
【发布时间】:2014-02-03 21:58:19
【问题描述】:

我尝试将我的数据保存到 MySql(local DB) throw HibernateTemplate -

getHibernateTemplate().execute(new HibernateCallback<Void>() {
            @Override
            public Void doInHibernate(Session session) throws HibernateException, SQLException {
                for (TimeInvocationStatistics stat : statistics) {
                    session.persist(stat);
                }
                session.persist(workloadProcessDescriptiveStatistics);
                session.flush();
                return null;
            }
        });

数据量不是很大,但这个操作需要 60 多秒。

我试图分析它 -

(良好的图片分辨率 - picture

我可以看到 session.flush()(stacktrace 中的第二行)运行缓慢,我该如何改进呢?会不会是 MySql 服务器的问题?

UPD:找到有趣的线程-hibernate forum,尝试这样做

【问题讨论】:

  • 请向我们展示 SQL 解释计划。它有助于确定数据库的工作时间

标签: java mysql performance hibernate


【解决方案1】:

不知道您有多少TimeInvocationStatistics,也不知道您的表是如何设置的,或者这些表中有多少数据。我最好的猜测是您在应该作为批处理插入的地方插入单独的行。我们最近有一个应用程序尝试插入 18k 行一些相当简单的数据(我最初不是我写的),仅仅通过批量插入,我们将时间从大约 18 分钟缩短到大约 2 秒。

如此大幅度改进的原因是索引和表大小。每次插入都会导致数据库重新计算索引。数据集越大,重新计算索引所需的时间就越长。这是索引数据库表的权衡:查找速度与插入速度。通过批量插入,数据库只需要为整个表计算一次索引。效率更高。

【讨论】:

  • 实体数量在200-500之间。关于索引的信息很有趣,我会检查它。
【解决方案2】:

问题是,批处理不起作用,因为我使用了错误的生成策略。在此处阅读有关此问题的信息 -

  1. JPA/Hibernate bulk(batch) insert
  2. Hibernate batch size confusion
  3. Hibernate forum

【讨论】:

    猜你喜欢
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 2019-03-26
    • 2012-12-23
    相关资源
    最近更新 更多