我们在Oracle数据库中有一个表Product,该表上有两个触发器,仅用于审计目的(传统实现)。
有时,当我们合并实体以更新此表时。它在冲洗时卡住,耗时约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 = ?
环境详细信息
问题已解决,因为触发器基于正在修改产品的用户进行某些表扫描。 PL / SQL修复解决了此问题。