我试图通过创建实体对象来填充数据库,并使用Hibernate作为JPA提供程序调用{{1}}。
一开始,数据库为空,然后我在循环中创建实体实例(100,000个实例),并保留每个实例。
此操作需要10分钟才能将所有实体注入数据库。 我正在使用免费的亚马逊云服务器机器,600 MB的RAM内存。
循环类似于以下内容:
persist()
如果我评论@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()
行时,循环需要10分钟才能完成。
此操作耗费时间和内存吗?或者它应该不快? 在这种情况下调用merge()而不是persist()更好吗?也许更快?
答案 0 :(得分:3)
是的,你需要查看documentation on batch processing。
你想做更像
的事情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();
}
}