无法一次插入所有实体。即使您可以在内部执行类似session.save(emplList)
的任何操作,Hibernate也会一一保存。
因此Hibernate的用户指南StatelessSession不使用批处理功能:
插入(),更新()和删除()由StatelessSession接口定义的操作直接在数据库中的行操作。它们导致相应的SQL操作立即执行。它们与Session接口定义的save(),saveOrUpdate()和delete()操作有不同的语义。
取而代之的是使用正常的会话并不时清除缓存。实际上,我建议你先测量你的代码,然后进行修改,比如使用hibernate.jdbc.batch_size
,这样你可以看到有多少调整改善了你的负载。
尝试改变它像这样:
session = sessionFactory.openSession();
int count = 0;
int step = 0;
int stepSize = 1_000;
long start = System.currentTimeMillis();
for(Employee e:emplList) {
session.save(e);
count++;
if (step++ == stepSize) {
long elapsed = System.currentTimeMillis() - start;
long linesPerSecond = stepSize/elapsed * 1_000;
StringBuilder msg = new StringBuilder();
msg.append("Step time: ");
msg.append(elapsed);
msg.append(" ms Lines: ");
msg.append(count);
msg.append("/");
msg.append(emplList.size());
msg.append(" Lines/Seconds: ");
msg.append(linesPerSecond);
System.out.println(msg.toString());
start = System.currentTimeMillis();
step = 0;
session.clear();
}
}
transcation.commit;
关于hibernate.jdbc.batch_size
- 你可以尝试不同的值,其中包括一些非常大的取决于使用和网络配置基础数据库。例如,对于应用服务器和数据库服务器之间的1gbps网络,我确实使用了10,000的值,每秒给我提供20,000条记录。
将stepSize
更改为相同的值hibernate.jdbc.batch_size
。
你有没有用简单的Session试过'hibernate.order_inserts'和'hibernate.order_updates'?你可以在保存一个员工时显示执行SQL语句吗? –