Java 使用Hibernate插入(更新)大量实体的最佳方法是什么?
我需要执行类似的操作Java 使用Hibernate插入(更新)大量实体的最佳方法是什么?,java,hibernate,orm,jdbc,Java,Hibernate,Orm,Jdbc,我需要执行类似的操作 for (int i = 0; i<=moreThanThousand; i++){ Entity e = new Entity(); insertEntity(e); } Hibernate中是否有批处理机制?在多个线程中执行此工作有意义吗?最佳做法是什么? 对于JDBC,我会使用PreparedStatement的addBatch()和executeBatch()方法,但我不擅长Hibernate。 提前谢谢 您可以使用以
for (int i = 0; i<=moreThanThousand; i++){
Entity e = new Entity();
insertEntity(e);
}
Hibernate中是否有批处理机制?在多个线程中执行此工作有意义吗?最佳做法是什么?
对于JDBC,我会使用PreparedStatement的addBatch()和executeBatch()方法,但我不擅长Hibernate。
提前谢谢 您可以使用以下方法定义批次大小:
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();
}
}
for(int i=0;i您可以使用以下方法定义批量大小:
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();
}
}
<代码> >(int i=0;i)如果你正在处理大量的数据,比如每天导入数据,并且你有一个非常小的处理窗口,那么最好的方法是直接使用JDBC访问你的数据库,考虑所有这些:
- 垃圾收集器-避免在关键操作上构造和释放数百万个对象
- 除了数据处理之外的数据导入-尝试使用存储过程处理数据库内的数据。在存储过程中,当数据与其他业务数据(通常需要)关联时,可以达到最佳性能
- 数据物理验证—解析操作和物理验证您应该只在导入阶段进行,只将清理后的数据留给存储过程,以便根据数据库中的其他业务数据进行验证
- 流水线-考虑构建一个同时处理多个阶段的流水线,当您导入数据时,已经导入的数据由存储过程异步处理,依此类推。
我可以告诉你,在我们每天只需2小时就可以处理大约800万条记录的系统上(我没有字节数,但容量很大),因此,即使使用允许的最高硬件,这也是达到最佳性能的唯一途径
我希望我已经给了你一个新的有用的方法。 如果你正在处理大量的数据,比如每天导入数据,并且你有一个非常小的处理窗口,那么最好的办法就是直接用JDBC访问你的数据库,考虑所有这些:
- 垃圾收集器-避免在关键操作上构造和释放数百万个对象
- 除了数据处理之外的数据导入-尝试使用存储过程处理数据库内的数据。在存储过程中,当数据与其他业务数据(通常需要)关联时,可以达到最佳性能
- 数据物理验证—解析操作和物理验证您应该只在导入阶段进行,只将清理后的数据留给存储过程,以便根据数据库中的其他业务数据进行验证
- 流水线-考虑构建一个同时处理多个阶段的流水线,当您导入数据时,已经导入的数据由存储过程异步处理,依此类推。
我可以告诉你,在我们每天只需2小时就可以处理大约800万条记录的系统上(我没有字节数,但容量很大),因此,即使使用允许的最高硬件,这也是达到最佳性能的唯一途径
我希望我已经给了你一个新的有用的方法来考虑。