我尝试将我的数据保存到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秒。
我试图描述它 -
(良好的图片分辨率 - picture)
我可以看到session.flush()(stacktrace中的第二行)工作缓慢,我怎么能改进它?可能是MySql服务器问题?
UPD:找到有趣的帖子 - hibernate forum,试着这样做
答案 0 :(得分:5)
不知道你有多少TimeInvocationStatistics
,也不知道你的表是如何设置的,或者这些表中有多少数据。我最好的猜测是你要插入单独的行作为批处理。我们最近有一个应用程序试图插入18k行一些相当简单的数据(我原来没有写它),只需转移到批量插入,我们将时间从大约18分钟缩短到大约2秒。
这种急剧改进的原因是索引和表格大小。每个插入都会导致DB重新计算索引。数据集越大,重新计算索引所需的时间越长。这是索引DB表的权衡:查找速度与插入速度慢。通过批量插入,DB只需要为整个表计算一次索引。效率更高。
答案 1 :(得分:2)
问题是,批处理不起作用,因为我使用了糟糕的生成策略。在这里阅读这个问题 -