2017-01-25 79 views
0

我目前正在使用Spring和Hibernate每31秒(Spring定時服務)檢索數據並保存到mysql表(Hibernate)的程序。使用休眠檢查數據庫重複的優化方法

我目前有一個HashMap檢查檢索的數據。如果檢索到的數據位於HashMap中,請使用該實例。如果數據不在HashMap中,則將其添加到HashMap並通過Hibernate保存該新條目。

我只關心這個設計,因爲這是一個每31秒運行一次的Spring計劃服務,HashMap對象也會每31秒重新創建一次在這種情況下,以前添加到HashMap的任何條目都不會在那裏了,重複的條目將被保存到表格中。

我已經想出了兩種方法來解決這一問題:

  1. 查詢的表上的所有當前條目,並用它們來填充HashMap的,HashMap的是用來檢查新數據之前檢索。這樣,即使在每31秒重新創建一次HashMap,仍然會擁有所有唯一條目。

  2. 查詢剛抵達表中的所有條目的新數據。這樣,不需要HashMap。每當新數據進入時,只需通過查詢對照所有條目進行檢查。

隨着表上條目數越來越大,兩種方式中的哪一種更優化?請隨時提出任何其他方法來做到這一點。謝謝。

我的代碼:

@Scheduled(fixedRate = 31000) 
public void saveCompanyData() {    

      // Retrieve data from online into Data 
      ... 
      ... 

      // Hibernate 
      SessionFactory factory = new Configuration() 
      .configure("hibernate.cfg.xml") 
      .addAnnotatedClass(Company.class) 
      .buildSessionFactory(); 
      Session session = factory.getCurrentSession(); 
      session.beginTransaction(); 

      // Create HashMap 
      HashMap<String, Company> companyMap = new HashMap<>(); 

      // Save to table if key not mapped 
      String companyKey = Data.getCompanyName(); 
      Company company; 
      if(companyMap.containsKey(companyKey)){ 
       company = companyMap.get(companyKey); 
      } else { 
       company = new company(Data.getCompanyName()); 
       companyMap.put(companyKey, company); 
       session.save(company); 
      } 

      // Commit 
      session.getTransaction().commit(); 
+0

第二個聽起來很公平。 – Antoniossss

回答

1

第二個聽起來很公平。由於companyMap將始終爲空,所以contains將始終爲假,因此代碼也沒有任何意義。

同樣當您在這裏提到優化時,您不應該在每次使用它時創建實體工廠,因爲這是昂貴的操作。它應該只創建一次,最有可能在應用程序初始階段,除非你有一些奇特的流程,允許在運行時改變hiberate.cfg