Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.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

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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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_Commit_Flush_Batch Insert - Fatal编程技术网

Java 如何在hibernate中提交批量插入?

Java 如何在hibernate中提交批量插入?,java,hibernate,commit,flush,batch-insert,Java,Hibernate,Commit,Flush,Batch Insert,我必须使用hibernate将大量对象保存到数据库中。 我希望在会话中出现n个(BATCH_SIZE)对象后立即提交,而不是一次提交所有对象 Session session = getSession(); session.setCacheMode(CacheMode.IGNORE); for(int i=0;i<objects.length;i++){ session.save(objects[i]); if( (i+1) % BATCH_SIZE == 0){

我必须使用hibernate将大量对象保存到数据库中。 我希望在会话中出现n个(BATCH_SIZE)对象后立即提交,而不是一次提交所有对象

Session session = getSession();
session.setCacheMode(CacheMode.IGNORE);
for(int i=0;i<objects.length;i++){
    session.save(objects[i]);
    if( (i+1) % BATCH_SIZE == 0){
        session.flush();
        session.clear();
    }
}

据我所知,你的解决办法是正确的

可能只有一个问题: 根据您从SessionFactory获取会话的方式,提交也可能会关闭您的会话,您必须打开一个新的会话。据我所知,如果使用getCurrentSession()和会话上下文“thread”,这种情况总是会发生。如果您使用的是openSession(),则会话似乎不会被提交自动关闭


提交事务后,您可以使用isOpen()方法轻松检查这一点。如果会话被关闭,您必须在进一步调用save()之前打开一个新会话。

我觉得不错。将数据库事务保持在较小的范围内,并清除会话缓存,这样堆中就不会充满分离的实体。当然,您应该简单地进行测试——将事务超时设置为一个非常低的数字(例如一分钟),并让此代码保留大量数据,然后查看代码是否完成了其工作。
Session session = getSession();
session.setFlushMode(FlushMode.COMMIT);
session.setCacheMode(CacheMode.IGNORE);
session.beginTransaction();
for(int i=0;i<objects.length;i++){
    session.save(objects[i]);
    if( (i+1) % BATCH_SIZE == 0){
        session.getTransaction().commit();
        session.clear();
        //should I begin a new transaction for next batch of objects?
        session.beginTransaction();
    }
}
session.getTransaction().commit();