【问题标题】:How to Hibernate Batch Insert with real time data? Use @Transactional or not?如何使用实时数据休眠批量插入?是否使用@Transactional?
【发布时间】:2017-03-29 21:40:23
【问题描述】:

我正在尝试使用当前插入数据库的数据执行批量插入,每个事务一个语句。事务代码语句如下所示。目前,对于来自外部提要的每个报价,都会调用 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)“神奇地”批量插入这些?或者我是否需要在同步列表中捕获每个报价更新,然后在达到批量大小限制时插入列表加载和清除列表?

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

【问题讨论】:

    标签: java spring hibernate transactional


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回答,但我相信我在上面发布的代码中,事务提交(因此刷新)会在每次插入时自动发生,因为服务方法使用事务注释。这是正确的假设吗?如果是这样,是否有一种干净的方式,使用事务标签或拦截器,在 25 个条目后执行批量提交?我宁愿不跟踪已经在代码中进行的插入,因为这会导致同步混乱。
    • 请指定如何调用您的服务方法。如果直接从任何其他 bean 调用它(例如从控制器调用),那么这可能是使用事务注释的正确方法。如果您在循环内调用服务方法或一次保存多条记录,则应将 Transactional 注释移至调用方法。确保服务方法没有完成,因此在没有批量更新大小插入发生之前不会提交。
    • 服务方法是从另一个bean中的方法调用的,本质上只是将数据放入自己的hashmap中,然后进行addHolding服务调用。这个外部方法每秒调用约 150 次,来自非 bean 类,每次事件来自外部提要。
    • 然后将 Transactional 移至外部方法。确保对服务方法的多次调用发生在事务上下文中,而不是每次调用都有事务上下文。所以 Hibernate 只有在多次插入发生后才能提交。由于设置了批量大小并且事务上下文仅在 20 次插入后才在外部,因此休眠会将这些更改与数据库同步。
    • 嗯...好吧,我会看看我是否可以制作一些中间类来批量处理这些并发送到批量插入事务服务方法。感谢您的所有帮助,芽:)
    猜你喜欢
    • 2013-02-28
    • 2015-08-01
    • 1970-01-01
    • 2012-08-14
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多