缓慢的Hibernate刷新

5

我试图通过HibernateTemplate将数据保存到MySql本地数据库中 -

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秒的时间。我尝试过对它进行剖析——如下图所示(图片分辨率高,可使用此链接查看)。
从栈跟踪中可以看出,session.flush()(第二行)运行得很慢,我该如何改善它?这可能是MySql服务器的问题吗?
更新:发现一个有趣的线程,请参考hibernate论坛中的解决方案。

请展示SQL解释计划。它有助于确定数据库的工作时间。 - ADS
2个回答

5
不知道你有多少个TimeInvocationStatistics,也不知道你的表是如何设置以及这些表中有多少数据。但是我的最佳猜测是你正在插入单个行,而应该批量插入。最近我们有一个应用程序尝试插入18k行相当简单的数据(我最初没有编写它),只是通过转移到批量插入,我们将时间从大约18分钟缩短到大约2秒。
这种巨大改进的原因是索引和表大小。每次插入都会导致DB重新计算索引。数据集越大,重新计算索引所需的时间就越长。这是在对DB表进行索引时的权衡:查找速度与插入速度的慢。通过批量插入,DB只需要一次为整个表计算索引。更加高效。

实体数量在200-500之间。关于索引的信息很有趣,我会去查看一下。 - Mary Ryllo

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接