使用hibernate检查数据库中重复的优化方法

时间:2017-01-25 21:06:50

标签: java mysql spring hibernate spring-mvc

我目前正在开发一个程序,它使用Spring和Hibernate每31秒检索一次数据(Spring预定服务)并保存到mysql表(Hibernate)。

我目前有一个检查检索数据的HashMap。如果检索的数据位于HashMap中,请使用该实例。如果数据不在HashMap中,请将其添加到HashMap并通过Hibernate保存此新条目。

我对此设计的唯一关注是,由于这是一个每31秒运行一次的Spring调度服务,所以HashMap对象也会每31秒重新创建一次。在这种情况下,以前添加到HashMap的任何条目都不会再在那里,重复的条目将保存到表格中。

我想出了两种解决问题的方法:

  1. 在使用HashMap检查检索到的新数据之前,查询表中的所有当前条目并使用它们填充HashMap。这样,即使在每31秒重新创建一次HashMap之后,仍然会拥有所有唯一条目。

  2. 查询刚进入桌面上所有条目的新数据。这样,就不需要HashMap。每当有新数据进入时,只需通过查询对所有条目进行检查。

  3. 随着桌面上的条目数量越来越大,这两种方式中的哪一种更加优化?请随时建议任何替代方法。感谢。

    我的代码:

    @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();
    

1 个答案:

答案 0 :(得分:1)

第二个听起来很公平。另外,给定代码没有任何意义,因为companyMap将始终为空,因此contains将始终为false。

此外,当您在此处引用优化时,每次要使用它时都不应创建实体工厂,因为这是一项昂贵的操作。它应该只创建一次,最有可能是在应用程序启动时,除非你得到一些允许在运行时更改hiberate.cfg的奇特流程。