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