Spring 带有@Transactional注释的批插入

Spring 带有@Transactional注释的批插入,spring,hibernate,transactions,Spring,Hibernate,Transactions,在我的spring应用程序中,我想一次性在数据库中插入近1500条记录。我在后端使用Spring4.X和普通hibernate。在我的服务层中,我使用@Transactional注释。现在,当在某个点之后插入记录时,我发现了一个内存错误。在网上搜索后,我发现我们可以使用类似的东西 Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); for ( int i=0;

在我的spring应用程序中,我想一次性在数据库中插入近1500条记录。我在后端使用Spring4.X和普通hibernate。在我的服务层中,我使用@Transactional注释。现在,当在某个点之后插入记录时,我发现了一个内存错误。在网上搜索后,我发现我们可以使用类似的东西

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
    if ( i % 20 == 0 ) { //20, same as the JDBC batch size
        //flush a batch of inserts and release memory:
        session.flush();
        session.clear();
    }
}

tx.commit();
session.close();
Session Session=sessionFactory.openSession();
事务tx=会话.beginTransaction();

对于(int i=0;i如果您希望从BMT(Bean管理事务)更改为CMT(容器事务管理),您的代码片段将变成:

@Transactional(propagation=Propagation.REQUIRES_NEW)
public void saveCustomers(){
    for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
    }
}
@Transactional(传播=传播。需要\u NEW)
公众客户(){

对于(inti=0;i)您的SpringXML配置是什么?只需删除会话即可(使用
sessionFactory.getCurrentSession
并保持
刷新
清除
。这是否意味着在我的代码中我必须手动强制使用sessionFactory?我不能只使用@Transactional注释吗?如果我手动使用会话和事务,那么在应用程序中使用@Transactional是没有用的…你得到了一个答案是什么?如果你需要问这个问题,我强烈建议你阅读一下hibernate是如何工作的,特别是关于缓存和脏检查的。你可能希望定期刷新以避免将所有100000个客户实例保留在hibernate一级缓存中。正确,但在这种情况下,我需要强制使用SessionFactory和Transac吗手动提交对象。对于@Transactional注释,它会在内部提交/回滚