Ответ 1
API JPA не предоставляет вам все возможности, чтобы сделать это оптимальным. В зависимости от того, насколько быстро вы хотите это сделать, вам придется искать специальные опции ORM - Hibernate в вашем случае.
Что нужно проверить:
- Убедитесь, что вы используете одну транзакцию (да, очевидно, вы уверены в этом)
- Проверьте, что ваш поставщик JPA (Hibernate) использует пакетный API JDBC (см. 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();
}
О, и если вы сделаете это через raw JDBC, вы пропустите служебные данные ORM (меньше создания объекта/сборка мусора и т.д.), поэтому я не буду игнорировать эту опцию.
Итак, да, это не отвечает на ваш вопрос, но может помочь вам в поиске более специфичных для ORM изменений в настройках партии.