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

时间:2017-03-29 21:40:23

标签: java spring hibernate transactional

我正在尝试使用当前每个事务将数据插入到DB一个语句的批量插入。事务代码语句类似于下面的内容。目前,正在为来自外部供稿的每个报价调用 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获取当前会话并调用save on object。

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)"神奇地"批量插入这些?或者,我是否需要在同步列表中捕获每个报价更新,然后在达到批量大小限制时插入列表加载和清除列表?

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

1 个答案:

答案 0 :(得分:1)

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

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

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