使用Hibernate原生查询进行批量插入

3
以下是在迭代中执行插入查询的代码:
session = sessionFactory.getCurrentSession();

        for (SampleBO items : listCTN) {    
            try {    
                query = session
                        .createSQLQuery("insert into xyx values(.......) where items="+items.getItem());

                OBJLOG.info("query executed is" + query);               
                query.executeUpdate();
                result = "success";
            }

这里的查询是一个接一个地执行。我该如何批量执行查询?

1个回答

2

首先,如果你想在Hibernate中使用正确的JDBC语句批处理,你需要在Hibernate的配置中设置批处理大小参数。根据Hibernate的文档,“建议值在5到30之间”:

hibernate.jdbc.batch_size=30

那么,在您的循环中,您需要每X次插入数据就刷新会话(X应与批量大小设置的数字匹配)。它应该像这样:

int count = 0;
for (SampleBO items : listCTN) {      
    query = session
            .createSQLQuery("insert into xyx values(.......) where items="+items.getItem());
    OBJLOG.info("query executed is" + query);               
    query.executeUpdate();
    result = "success";

    if (++count % 30 == 0){
        session.flush();
        session.clear();
    }
}
//optional - I've seen issues in hibernate caused by not flushing data for the last iteration, for example -  the last 10 inserts.
session.flush();
session.clear();

相关阅读:

https://www.tutorialspoint.com/hibernate/hibernate_batch_processing.htm https://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch15.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接