我有一个更新查询,我试图通过spring jdbc模板的batchupdate方法执行该查询。此更新查询可能会匹配Event_dynamic_attribute表中需要更新的1000行。除超时外,在表中更新数千行会导致生产数据库中的任何问题吗?例如,它会崩溃数据库或放缓其他连接的整个数据库引擎的性能吗?
?有没有更好的方法来实现此目的,而不是在Spring JDBC模板或JPA中触发单个更新查询?我有以下JDBC模板的设置。
this.jdbc = new JdbcTemplate(ds);
jdbc.setFetchSize(1000);
jdbc.setQueryTimeout(0); // zero means there is no limit
更新查询:
UPDATE EVENT_DYNAMIC_ATTRIBUTE eda
SET eda.ATTRIBUTE_VALUE = 'claim',
eda.LAST_UPDATED_DATE = SYSDATE,
eda.LAST_UPDATED_BY = 'superUsers'
WHERE eda.DYNAMIC_ATTRIBUTE_NAME_ID = 4002
AND eda.EVENT_ID IN
(WITH category_data
AS ( SELECT c.CATEGORY_ID
FROM CATEGORY c
START WITH CATEGORY_ID = 495984
CONNECT BY PARENT_ID = PRIOR CATEGORY_ID)
SELECT event_id
FROM event e
WHERE EXISTS
(SELECT 't'
FROM category_data cd
WHERE cd.CATEGORY_ID = e.PRIMARY_CATEGORY_ID))
如果这是一次事情,我通常会首先选择需要更新并放入临时表或CSV的记录,并确保我保存我的主键这些记录在表格或CSV中。然后,我从临时表或CSV中读取记录,并使用主键在表中进行更新。这样,很长一段时间内就不会锁定表,并且您可以在批处理中添加了固定的记录,其中需要更新,并且使用主键进行更新,因此它将非常快。而且,如果任何更新失败,则知道通过在日志文件或错误表中记录失败的记录主键而导致了哪些记录失败。我已经遵循了这种方法,以更新POD数据库中的数百万个记录,因为这是非常安全的方法。