缓慢的冬眠冲洗

时间:2014-01-15 12:21:59

标签: 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;
            }
        });

数据的大小不是很大,但此操作需要60秒。

我试图描述它 -

enter image description here

(良好的图片分辨率 - picture

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

UPD:找到有趣的帖子 - hibernate forum,试着这样做

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

问题是,批处理不起作用,因为我使用了糟糕的生成策略。在这里阅读这个问题 -

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