我目前正在开发一个程序,它使用Spring和Hibernate每31秒检索一次数据(Spring预定服务)并保存到mysql表(Hibernate)。
我目前有一个检查检索数据的HashMap。如果检索的数据位于HashMap中,请使用该实例。如果数据不在HashMap中,请将其添加到HashMap并通过Hibernate保存此新条目。
我对此设计的唯一关注是,由于这是一个每31秒运行一次的Spring调度服务,所以HashMap对象也会每31秒重新创建一次。在这种情况下,以前添加到HashMap的任何条目都不会再在那里,重复的条目将保存到表格中。
我想出了两种解决问题的方法:
在使用HashMap检查检索到的新数据之前,查询表中的所有当前条目并使用它们填充HashMap。这样,即使在每31秒重新创建一次HashMap之后,仍然会拥有所有唯一条目。
查询刚进入桌面上所有条目的新数据。这样,就不需要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 :(得分:1)
第二个听起来很公平。另外,给定代码没有任何意义,因为companyMap
将始终为空,因此contains
将始终为false。
此外,当您在此处引用优化时,每次要使用它时都不应创建实体工厂,因为这是一项昂贵的操作。它应该只创建一次,最有可能是在应用程序启动时,除非你得到一些允许在运行时更改hiberate.cfg
的奇特流程。