2014-01-15 90 views
4

我尝试我的数据保存到MySql(本地DB)抛出的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()(第二行中的堆栈跟踪)的作品慢,怎么我可以改善吗?难道是MySql服务器的问题?

UPD:发现有趣的话题 - hibernate forum,试图以这种方式

+0

请告诉我们SQL释计划。它有助于弄清楚数据库工作的时间长度 – ADS

回答

4

做不知道你有多少TimeInvocationStatistics有,也没怎么你的表是建立或有多少数据是这些表中,我最好的猜测。是因为你插入了你应该作为批处理插入的单独行。我们最近有一个应用程序尝试插入18k行一些相当简单的数据(我原本没有写它),并且只需移动到批量插入,我们就可以将时间从大约18分钟缩短到大约2秒。

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

+0

实体数量在200-500之间。有关索引的信息很有趣,我会检查它。 –