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

标签 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 检查检索到的新数据。这样,HashMap 即使每 31 秒重新创建一次,仍然拥有所有唯一的条目。

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

最佳答案

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

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

关于java - 使用 hibernate 检查数据库重复的优化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41861651/

相关文章:

mysql - Rails 无法删除或更新父行 : a foreign key constraint fails

Spring 批处理 : Reading a File : if field is empty setting the default value

java - Spring 5 报告

java - 原型(prototype)范围不工作

java - Linux 中的 Spring PropertyPlaceholderConfigurer

java - 关于Eclipse的几个问题

java - mysql utf-8 从一台机器返回乱码

php - 来自 3 个表和 where 子句的 Mysql 查询

java - XMPPError : bad-request - modify error create new user using smack library 4. 1.8 和 openfire

java - 如何设置静态宽度以在 SWT 中查看