使用Hibernate插入(更新)大量实体的最佳方法是什么?

时间:2012-02-16 12:07:57

标签: java hibernate orm jdbc

我需要执行类似

的操作
   for (int i = 0; i<=moreThanThousand; i++){
       Entity e = new Entity();
       insertEntity(e);
   }

for (Entity e: moreThanThousandEntities){
       updateEntity(e);
   }

Hibernate中是否有一些批处理机制?在多个线程中执行此工作是否有意义?什么是最佳做法? 使用JDBC我会使用PreparedStatement的addBatch()和executeBatch()方法,但我不是Hibernate的专家。 提前谢谢!

2 个答案:

答案 0 :(得分:3)

您可以使用以下方法定义批量大小:

hibernate.jdbc.batch_size 20

批量插入/更新很简单:

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

有关详细信息,请查看here

答案 1 :(得分:1)

如果您正在处理大量数据,例如每天导入数据,并且您有一个非常小的处理窗口,那么最好的方法是使用JDBC直接访问您的数据库,考虑所有这些:< / p>

  • 垃圾收集器 - 避免在关键操作中构建和释放数百万个对象
  • 除数据处理之外的数据导入 - 尝试使用存储过程处理数据库内的数据。在将数据与其他业务数据(通常需要)相关联时,您可以获得最佳性能。
  • 数据物理验证 - 您只希望在导入阶段进行解析操作和物理验证,只将清理后的数据与DB中的其他业务数据进行验证。
  • 管道 - 考虑构建一个处理流程,以便同时执行多个阶段。导入数据时,已导入的数据由存储过程异步处理,依此类推。

我可以告诉你,在系统上我们应该每天只用2小时处理大约8百万条记录(我没有以字节为单位但是很大),因此是达到最佳性能的唯一方法即使使用最高硬件也是如此。

我希望我给你一个新的有用的方法来考虑。