2017-01-25 38 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