Java 使用hibernate本机查询进行批插入
下面是在迭代中执行insert查询的代码:Java 使用hibernate本机查询进行批插入,java,hibernate,bulkinsert,native-sql,Java,Hibernate,Bulkinsert,Native Sql,下面是在迭代中执行insert查询的代码: session = sessionFactory.getCurrentSession(); for (SampleBO items : listCTN) { try { query = session .createSQLQuery("insert into xyx values(.......) where ite
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";
}
这里查询一个接一个地执行。如何批量执行查询 首先,如果要在hibernate中使用正确的JDBC语句批处理,必须在hibernate的配置中设置batch size参数。根据Hibernate的文档,“5到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();
另请参见:
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();