缓慢的冬眠冲洗

Mar*_*llo 5 java mysql performance hibernate

我尝试将我的数据保存到MySql(本地数据库)抛出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;
            }
        });
Run Code Online (Sandbox Code Playgroud)

数据的大小不是很大,但这个操作需要60秒.

我试图描述它 -

在此输入图像描述

(好的图片分辨率 - 图片)

我可以看到session.flush()(stacktrace中的第二行)工作缓慢,我怎么能改进它?可能是MySql服务器问题?

UPD:找到有趣的线程 - 休眠论坛,试着这样做

Cod*_*imp 5

不知道TimeInvocationStatistics你有多少,也不知道你的表是如何设置的,或者这些表中有多少数据.我最好的猜测是你要插入单独的行作为批处理.我们最近有一个应用程序试图插入18k行的一些相当简单的数据(我最初没有写它),只是通过移动到批量插入,我们将时间从大约18分钟减少到大约2秒.

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


Mar*_*llo 2

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

  1. JPA/Hibernate 批量(批量)插入
  2. Hibernate 批量大小混乱
  3. 休眠论坛