2012-05-21 30 views
0

您好我有一個應用程序,我首先檢查數據庫表中的值,如果不存在,生成一個新的值並插入到數據庫中,這個循環大約有一百萬次,我怎麼能加快?在hibernate中多次調用插入?

public void save(Object obj,Session session) {  

      Transaction tx = null; 
      try { 
       tx = session.beginTransaction(); 
       session.saveOrUpdate(obj); 
       session.flush(); 

       session.clear(); 
       tx.commit(); 
      } 
      catch (HibernateException e) { 
       e.printStackTrace(); 
       logger.error(e.getMessage(), e);    

       if(tx!=null){ 
        tx.rollback(); 
       } 
      } 
      catch (Exception e) { 
       e.printStackTrace(); 

       logger.error(e.getMessage(), e);   

      } 
     } 

我怎麼能加快這,或者這是正確的做法 - :

在我工人階級: -

session=HibernateSessionFactory.getSession();  
    for(----loop 

    i check 

    i generate 

    then:- 

    MyTable myTable=new MyTable(); 
      myTable.setName("dasdas"); 
      myTable.setww("ss"); 
      myTable.setaa("daaasdas"); 

    hibernateRepositoy.save(dgCcno,session); 

} 

保存方法我其他類?

補充: - 我不能使用批量更新,我必須插入值向右走,導致在下一次選擇查詢值可以是相同的..而不得不放棄從DB則該值

+0

您可以使用hibernate批處理。有關更多詳細信息,請參閱http://stackoverflow.com/questions/8972853/hibernate-batch-insert-batch-update。 – tibtof

+0

@tibtof沒有我不能,我必須馬上插入值,導致在下一個選擇查詢中的值可以是相同的..並且必須從數據庫中給出值然後 – Harinder

+0

你必須馬上提交嗎?我認爲如果你只使用一個事務,它將會更快。 – tibtof

回答

6
  • 不要每行使用一個交易,但包括一切都在一個單一的交易
  • 問題單查詢,以驗證在幾排的存在(或至少顯著子集)一次
  • 按照advices of the reference documentation
+0

plz檢查更新的問題,我必須立即插入值 – Harinder

+1

在給定的事務中,您插入的所有內容都對此事務可見。所以你可以執行下一個查詢,並且它會找到你插入的行,即使這個事務沒有被提交。唯一重要的是會話必須被刷新。但是Hibernate足夠聰明,可以在執行查詢之前自動刷新它。 –

+0

我會試試看,所以你可以告訴我,在我調用tx.commit()之前,我可以保存的對象是否有限制。就像我必須保存大約100萬條記錄一樣? – Harinder