2017-02-10 2 views
1

deptcode | EmpName | jobtype | отдел | ДЮОптимизация вставки вызовов в Java для загрузки файлов насыпных

  1. 121 | Джон | Постоянные | Кредиторская | 12/12/2012

  2. 122 | Пол | Постоянная | Доход | 11/12/2011

  3. 123 | Марка | Исполнитель | Продажа | 04/05/2010

  4. 121 | Майк | Постоянные | Счета | 08/09/2009

  5. 123 | Nash | Исполнитель | Продажа | 12/15/2016

  6. 124 | Doe | Исполнитель | Маркетинг | 12/04/2013

Описание проблемы:

  1. Это файл CSV, который я пытаюсь загрузить с помощью MultiFileupload.

  2. Прочтите его и создайте список.

  3. Этот список валидирован для EMP_TRANS_TABLE для дубликатов записей.

  4. DEPT_CODE + JOB_TYPE + DOJ становится моим составным первичным ключом.

  5. Я использую SPRING JPA Predicatesto, проверяя повторяющиеся значения и , затем вставляем значения.

  6. Это работает отлично до 750 записей, кроме того, что оно принимает более чем 4 минут, чтобы сохранить данные и получить тайм-аут, чтобы отправить ответ обратно к переднему концу.

Technology Stack:

1) Frontend- Угловая JS

2) Весна Отдых Услуги и Spring JPA (спящий режим)

3) WAS 8.5 сервер приложений и SQL Server 2008 по Linux

4) Java 1.7

Вопрос

  1. Как оптимизировать мой DB валидаций и вставки из Java стороны , как я ничего не могу с DB стороны изменять и не может перейти на Java 1,8 также.
  2. Мое требование состоит в том, чтобы поддерживать 5000 записей, где при проверке БД и вставка должна произойти за 2 минуты.
  3. Ищет оптимальное решение с соответствующей частью кода, поскольку оно должно применяться для загрузки нескольких веб-страниц через приложение.

ответ

0

Существует зимуют свойство, которое можно определить как одно из свойств в Hibernate SessionFactory:

<property name="jdbc.batch_size">500</property> 

С этой партии установки вы должны иметь выход как:

insert into Table(id , name) values (1, 'na1') , (2, 'na2') ,(3, 'na3').. 

вместо

insert into Table(id , name) values (1, 'na1'); 
insert into Table(id , name) values (2, 'na2'); 
insert into Table(id , name) values (3, 'na3'); 

В трансе action, вы бы продолжали около 500 организаций .., а затем очистили транзакцию за лучшую производительность до тех пор, пока все данные не будут сохранены:

Transaction tx = session.beginTransaction(); 
for (int i=0; i<5000; i++) { 
    EmpTrans empTrans = new EmpTrans(); 

    // populate empTrans attributes 

    session.save(empTrans); 

    if (i % 500 == 0) { //500 , same as the JDBC batch size 
     //flush a batch of inserts and release memory: 
     session.flush(); 
     session.clear(); 
    } 
} 
tx.commit(); 
Смежные вопросы