2015-08-18 1 views
1

Пример:JPA 2.0: Как повысить производительность объемной вставки через JPA

У меня есть три таблицы: местоположение, отдел, сотрудник

теперь позволяет сказать, местоположение и отдел являются мастер-таблица, которые уже имеют всю информацию. Теперь мне нужно вставить 1000 сотрудников списка через JPA. У меня есть отношения с местоположением и отделом в таблице сотрудников.

так что теперь, чтобы вставить запись в Работника, после я делаю:

for loop...1000 
Employee e = new Employee(); 
e.setId(12); 
e.setEmpname("ABC"); 
Location l = null; 
l = em.find(Location.class, 234); 
e.setLocation(l); 
    Department d = null; 
d = em.find(Department.class, 111); 
e.setDepartment(d); 
em.persist(e); 
loop ends... 

Это занимает некоторое время, чтобы загрузить данные в БД. Это единственный способ вставить данные через JPA, поскольку это замедляет производительность. Я не хочу использовать собственные запросы. Просьба предложить, если у кого-то есть лучший подход, чтобы сделать его более эффективным.

+1

DO флеша и ясно в между й количеством упорствует. Иначе это будет медленнее, медленнее и медленнее из-за грязных проверок. –

ответ

4

JPA 2.0 не обеспечивает особую поддержку для пакетных вставок. Держа в идиомах JPA, вы можете сделать это:

EntityManager em = ...; 
EntityTransaction tx = em.getTransaction(); 
tx.begin(); 

for (int i = 0; i < 100000; i++) { 
    Employee e = new Employee(); 
    // setup entity 
    em.persist(e); 
    if ((i > 0) && (i % 20 == 0)) { // Flush in batches of 20 to keep caches from bogging. 
     em.flush(); 
     em.clear(); 
    } 
} 

tx.commit(); 
session.close(); 

Или, вы можете использовать em.createNativeQuery() и выпалить родную SQL пакетной вставку.

Существует несколько других возможностей в зависимости от конкретной базы данных и ORM, которые вы используете. Например, есть трюки с EclipseLink (http://java-persistence-performance.blogspot.com/2011/06/how-to-improve-jpa-performance-by-1825.html) или параметризация (http://java-persistence-performance.blogspot.com/2013/05/batch-writing-and-dynamic-vs.html).

Hibernate конкретных проходные можно найти здесь: http://korhner.github.io/hibernate/hibernate-performance-traps-part-2/