如何使用实时数据休眠批量插入?是否使用@Transactional?

How to Hibernate Batch Insert with real time data? Use @Transactional or not?

我正在尝试对当前插入到数据库的数据执行批量插入,每个事务一个语句。事务代码语句类似于以下内容。目前,addHolding() 方法正在为来自外部提要的每个报价调用,并且这些报价更新中的每一个每秒发生大约 150 次。

public class HoldingServiceImpl {

    @Autowired
    private HoldingDAO holdingDao;

    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
    public void addHolding(Quote quote) {
        Holding holding = transformQuote(quote);
        holdingDao.addHolding(holding);
    }

}

并且 DAO 正在从 Hibernate SessionFactory 获取当前会话并在对象上调用保存。

public class HoldingDAOImpl {

    @Autowired
    private SessionFactory sessionFactory;

    public void addHolding(Holding holding) {
        sessionFactory.getCurrentSession().save(holding);
    }

}

我查看了 Hibernate batching documentation,但文档中并不清楚在这种情况下我将如何组织批量插入代码,因为我手头没有完整的数据列表,而是正在等待它流式传输。

仅在属性文件中设置 Hibernate 批处理属性(例如 hibernate.jdbc.batch_size=20)"magically" 是否可以批量插入这些?或者我是否需要,比如说,在同步列表中捕获每个报价更新,然后在达到批量大小限制时插入列表加载和清除列表?

此外,实施批处理的全部目的是查看性能是否提高。如果在这种情况下有更好的方法来处理插入,请告诉我。

设置 属性 hibernate.jdbc.batch_size=20 指示休眠在 20 次后刷新对象。在您的情况下,休眠会在保存 20 条记录后自动调用 sessionfactory.flush() 。

当您调用 sessionFactory.save() 时,插入命令仅触发到内存中的休眠缓存。只有在调用 Flush 后,hibernate 才会将这些更改与数据库同步。因此设置休眠批量大小足以进行批量插入。根据您的需要微调批量大小。

还要确保您的交易得到妥善处理。如果您提交事务也会强制休眠刷新会话。