我正在尝试使用当前每个事务将数据插入到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
)"神奇地"批量插入这些?或者,我是否需要在同步列表中捕获每个报价更新,然后在达到批量大小限制时插入列表加载和清除列表?
此外,实现批处理的全部目的是查看性能是否有所改善。如果在这种情况下有更好的方法来处理插入,请告诉我。
答案 0 :(得分:1)
设置属性hibernate.jdbc.batch_size = 20表示hibernate在20之后刷新对象。在你的情况下,hibernate会在保存20条记录后自动调用sessionfactory.flush()。
当你调用sessionFactory.save()时,insert命令只被激活到内存中的hibernate缓存。只有在调用Flush时,hibernate才会将这些更改与数据库同步。因此,设置休眠批量大小足以进行批量插入。根据您的需要微调批量大小。
还要确保您的交易得到妥善处理。如果你提交一个事务,也会强制hibernate刷新会话。