JPA API 并没有为您提供所有选项来使其达到最佳状态。根据您想要执行此操作的速度,您将不得不寻找 ORM 特定选项 - 在您的情况下为 Hibernate。
检查事项:
- 检查您使用的是单笔交易(是的,显然您对此很确定)
- 检查您的 JPA 提供程序(Hibernate)是否使用 JDBC 批处理 API(请参阅:hibernate.jdbc.batch_size)
- 检查您是否可以绕过获取生成的密钥(取决于 db/jdbc 驱动程序从中获得多少好处 - 请参阅:hibernate.jdbc.use_getGeneratedKeys)
- 检查您是否可以绕过级联逻辑(仅从中获得最小的性能优势)
所以在 Ebean ORM 中,这将是:
EbeanServer server = Ebean.getServer(null);
Transaction transaction = server.beginTransaction();
try {
// Use JDBC batch API with a batch size of 100
transaction.setBatchSize(100);
// Don't bother getting generated keys
transaction.setBatchGetGeneratedKeys(false);
// Skip cascading persist
transaction.setPersistCascade(false);
// persist your beans ...
Iterator<YourEntity> it = null; // obviously should not be null
while (it.hasNext()) {
YourEntity yourEntity = it.next();
server.save(yourEntity);
}
transaction.commit();
} finally {
transaction.end();
}
哦,如果您通过原始 JDBC 执行此操作,您将跳过 ORM 开销(更少的对象创建/垃圾收集等) - 所以我不会忽略该选项。
So yes, this doesn't answer your question but might help your search for more ORM specific batch insert tweaks.