【发布时间】: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