有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在Hibernate中有效地进行批量更新

我读了很多文章,找到了一些批量处理的方法

其中之一就是使用flush和clear,下面是代码

        long t1 = System.currentTimeMillis();
        Session session = getSession();
        Transaction transaction = session.beginTransaction();
        try {
            Query query = session.createQuery("FROM PersonEntity WHERE id > " + lastMaxId + " ORDER BY id");
            query.setMaxResults(1000);
            rows = query.list();
            int count = 0;
            if (rows == null || rows.size() == 0) {
                return;
            }
            LOGGER.info("fetched {} rows from db", rows.size());
            for (Object row : rows) {
                PersonEntity personEntity = (PersonEntity) row;
                personEntity.setName(randomAlphaNumeric(30));
                lastMaxId = personEntity.getId();
                session.saveOrUpdate(personEntity);
                if (++count % 50 == 0) {
                    session.flush();
                    session.clear();
                    LOGGER.info("Flushed and Cleared");
                }
            }
        } finally {
            if (session != null && session.isOpen()) {
                LOGGER.info("Closing Session and commiting transaction");
                transaction.commit();
                session.close();
            }
        }
        long t2 = System.currentTimeMillis();
        LOGGER.info("time taken {}s", (t2 - t1) / 1000);

在上面的代码中,我们处理1000条记录,并在同一事务中更新它们

当我们只需要进行批量更新时就可以了

但我有以下问题:

  1. 当其他线程(T2)访问同一组行以执行某些运行时更新操作时,可能会出现这种情况,但在这种情况下,直到不提交1000个批时,T2才会停止

那么,我们应该如何处理这个案子呢

我可能的想法/解决方案:

  1. 我想我们可以在不同的时段进行更新,比如说50次
  2. 使用不同的无状态连接逐个更新和提交事务,但在一批1000个事务完成后关闭会话

请帮我找到更好的解决方案


共 (1) 个答案

  1. # 1 楼答案

    你是说:

    1. 事务内部正在进行批量更新

    2. 与此同时,另一个线程也开始更新批处理中的一条记录

    3. 因此,批处理将等待第2点中的更新完成。这会导致批处理中的其余记录也等待。 到目前为止,一切似乎都很好。然而,这里重要的一点是,完成该事务是为了“更快”更新一大组记录。通常,事务用于确保“一致性/原子性”。 如何设计这篇文章——一次过快速更新多条记录,原子性不是主要标准,而另一个线程也会请求对批处理中的一条记录进行可能的更新