2014-01-15 129 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之間。有關索引的信息很有趣,我會檢查它。 –