TopLink JPA EntityManager сбрасывается и Oracle при запуске обновления - PullRequest
0 голосов
/ 23 декабря 2018

У нас есть одна таблица Product в базе данных Oracle, в которой есть два триггера только для целей аудита (устаревшая реализация).

  1. Для вставки или обновления
  2. при обновлении

Иногда, когда мы объединяем сущность для обновления этой таблицы.он застрял при промывке и потребляет время ~ 2-3 секунды.Такое поведение мы не можем воспроизвести в среде разработки, и мы не очень уверены, что является причиной этой задержки.Раньше мы не размещали EntityManager.flush (), поэтому режим сброса был автоматическим.Но это было заблокировано на любом последующем утверждении выбора.Затем мы попытались добавить сброс во время самого слияния.

public class ProductDAO{
     private EnitiyManager em;
     public void updateProduct(ProductDTO productDTO){
         Product product = em.findById(Product.class, productDTO.getId());
         product.setModifiedDate(new Date());
         long start = System.currentTimeMillis();
         em.merge(product);
         em.flush(); // This call get blocked by DB
         System.out.println("Time taken (ms): " + (start - System.currentTimeMillis());
     }
}

Сгенерированный SQL для этого обновления очень прост, и мы пытаемся выяснить, что вызывает такую ​​большую задержку.

UPDATE PRODUCT SET MODIFIED_DATE = ? WHERE PRODUCT_ID = ?

Сведения об окружении

  • JPA 2
  • Toplink
  • Oracle
  • 3,5 миллиона записей в таблице PRODUCT

Проблема устранена , поскольку триггер выполнял сканирование таблицы в зависимости от пользователя, который вносит изменения в Продукт.Исправление PL / SQL решило эту проблему.

...