Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用hibernate本机查询进行批插入_Java_Hibernate_Bulkinsert_Native Sql - Fatal编程技术网

Java 使用hibernate本机查询进行批插入

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

下面是在迭代中执行insert查询的代码:

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();