2015-10-13 2 views
0

Я использую eclipselink и postgresql в приложении jpa.Добавление нового объекта в ассоциацию ManyToOne занимает много мощности процессора

У меня есть 3 таблицы, которые связаны следующим образом: Запись @OneToMany в ArchiveMediasRecords, AchiveMedia @OneToMany для ArchiveMediasRecords и ArchiveMediasRecords с @ManyToOne как для записи, так и для AchiveMedia.

ArchiveMediasRecords - это таблица, которая предоставляет информацию об атрибутах для связи между Record и AchiveMedia.

Моя проблема заключается в том, что я вставляю запись каждые 100 мс, а вставка выполняется с использованием пула из 10 потоков.

Я делаю что-то вроде этого:

Создать новую запись
Создать новую EntityManager (один новый ет за выполнение потоков)
Создать транзакцию, и начать его
Для каждого ArchiveMedia заявил, сделать Assocation с запись через ArchiveMediasRecords
Упорство запись (каскад хорошо объявлен, чтобы сделать его проще)
зафиксировать транзакцию

databa se обновляется, проблем нет.

Проблема заключается в том, что количество записей может быть довольно большим (> 400000), но ArchiveMedia не является (< 20).

Когда я добавляю запись в архив, метод add в IndirectList ассоциации @OneToMany в ArchiveMedia занимает много времени и много мощности процессора.

Есть ли способ уменьшить простой процесс ассоциации на большом XXXToMany?

ответ

0

Хорошо, так что я wan't смог найти, как оптимизировать свою массивную вставку, я tryied что-то другое:

Я вставив запись сущность без ассоциации. Затем я вставляю ассоциацию, используя jpbc низкого уровня из jpa.

Это позволяет снизить нагрузку процессора на java-процесс с 20% до 1% и снизить нагрузку процессора postgresql с 18% до < 1%.

Большой успех!

Но это в основном обходное решение, чем реальное решение. Во всяком случае, проблема решена.