1

我正在尝试通过创建实体对象并persist()使用 Hibernate 作为 JPA 提供程序进行调用来填充数据库。

一开始,数据库是空的,然后我在一个循环中创建实体实例(100,000 个实例),并将每个实例持久化。

此操作需要大约 10 分钟才能将所有实体注入数据库。我正在使用免费的轮胎亚马逊云服务器机器,600 MB RAM 内存。

循环如下所示:

@Transactional
void populateDataBase()
{
    for(int i=0; i<100000; i++)
    {
        MyEntityPK entityInstancePK = new MyEntityPK(idfield1, idField2, idField3);

        MyEntity entityInstance = new MyEntity();

        entityInstance.setId(entityInstancePK);

        entityInstance.setField1(integerValue);
        entityInstance.setField2(integerValue);

        entityInstance.persist();
    }
}

如果我评论该persist()行,循环将在几秒钟内完成。当我取消注释该entityInstance.persist();行时,循环大约需要 10 分钟才能完成。

这个操作是不是很费时间和内存?或者它不应该很快?在这种情况下调用 merge() 而不是 persist() 更好吗?也许更快?

4

1 回答 1

3

是的,您需要查看有关批处理的文档

你想做一些更像

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();
    }
}
于 2012-08-10T13:38:07.797 回答