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

Java 如何使用实时数据休眠批插入?是否使用@Transactional?,java,spring,hibernate,transactional,Java,Spring,Hibernate,Transactional,我试图对当前插入到DB的数据执行批插入,每个事务一条语句。事务代码语句如下所示。目前,addHolding方法正在为来自外部提要的每个quote调用,这些quote更新大约每秒发生150次 public class HoldingServiceImpl { @Autowired private HoldingDAO holdingDao; @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFo

我试图对当前插入到DB的数据执行批插入,每个事务一条语句。事务代码语句如下所示。目前,addHolding方法正在为来自外部提要的每个quote调用,这些quote更新大约每秒发生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

public class HoldingDAOImpl {

    @Autowired
    private SessionFactory sessionFactory;

    public void addHolding(Holding holding) {
        sessionFactory.getCurrentSession().save(holding);
    }

}
我已经看过了,但从文档中不清楚在这种情况下如何组织批插入代码,因为我手头没有完整的数据列表,而是在等待它流式处理

仅仅在属性文件(例如Hibernate.jdbc.batch_size=20)中设置Hibernate批处理属性是否会神奇地批量插入这些属性?或者说,我需要在同步列表中捕获每个报价更新,然后在达到批量大小限制时插入列表加载和清除列表


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

设置hibernate.jdbc.batch\u size=20表示hibernate在20之后刷新对象。在您的情况下,hibernate会在保存20条记录后自动调用sessionfactory.flush

调用sessionFactory.save时,insert命令仅对内存中的hibernate缓存触发。只有在调用Flush之后,hibernate才会将这些更改与数据库同步。因此,设置hibernate批大小就足以执行批插入。根据需要微调批量大小


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

谢谢您的回答,但我相信我上面发布的代码,事务提交和刷新会在每次插入时自动发生,因为服务方法使用事务注释。这是正确的假设吗?如果是这样,是否有一种干净的方法,使用事务性标记或拦截器,在25个条目之后执行批提交?我不希望跟踪代码中已经进行的插入,因为这会导致同步混乱。请指定如何调用您的服务方法。如果它是从任何其他bean直接从控制器为ex调用的,那么这可能是使用事务性注释的正确方法。如果要在循环内调用服务方法或其他方法以同时保存多个记录,则事务性注释应移动到调用方法。确保服务方法未完成,因此在没有批量更新大小的插入之前不会提交。服务方法是从另一个bean中的方法调用的,该bean本质上只是将数据放入自己的hashmap中,然后进行addHolding服务调用。这个外部方法每秒从非bean类调用150次,每次事件来自外部提要。然后将事务性方法移动到外部方法。确保对服务方法的多个调用发生在事务上下文中,而不是每个调用都有transactioncontext。因此,Hibernate只能在多次插入后提交。由于批大小已设置,并且只有在20次插入之后,事务上下文才在外部。hibernate将这些更改与数据库同步。嗯……好的,我将看看是否可以生成一些中间类,对这些更改进行批处理并发送到批插入事务服务方法。谢谢你的帮助,巴德: