如何使用实时数据休眠批量插入?是否使用@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 才会将这些更改与数据库同步。因此设置休眠批量大小足以进行批量插入。根据您的需要微调批量大小。
还要确保您的交易得到妥善处理。如果您提交事务也会强制休眠刷新会话。
我正在尝试对当前插入到数据库的数据执行批量插入,每个事务一个语句。事务代码语句类似于以下内容。目前,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 才会将这些更改与数据库同步。因此设置休眠批量大小足以进行批量插入。根据您的需要微调批量大小。
还要确保您的交易得到妥善处理。如果您提交事务也会强制休眠刷新会话。