TopLink JPA EntityManager刷新和Oracle触发更新

时间:2018-12-23 19:06:59

标签: java oracle jpa triggers toplink

我们在Oracle数据库中有一个表Product,该表上有两个触发器,仅用于审计目的(传统实现)。

  1. 用于插入或更新
  2. 更新

有时,当我们合并实体以更新此表时。它在冲洗时卡住,耗时约2-3秒。我们在开发环境中无法产生这种行为,并且我们不确定导致此延迟的原因。在尚未放置EntityManager.flush()之前,刷新模式是自动的。但是随后的任何select语句都将其阻塞。然后,我们尝试在合并本身时添加刷新。

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
  • 顶部链接
  • Oracle
  • PRODUCT表中有350万条记录

问题已解决,因为触发器基于正在修改产品的用户进行某些表扫描。 PL / SQL修复解决了此问题。

0 个答案:

没有答案