Spring JDBC Template batchUpdate更新tbale

时间:2017-12-09 19:31:07

标签: java oracle sql-update spring-jdbc batch-updates

我有一个更新查询,我试图通过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))

1 个答案:

答案 0 :(得分:0)

如果是一次性的话,我通常首先选择需要更新并放在临时表或csv中的记录,并确保将这些记录的主键保存在表格或表格中CSV。然后我从临时表或csv批量读取记录,并使用主键在表中进行更新。这样,表格不会长时间锁定,您可以在批处理中添加固定的记录集,这些记录需要更新,并且使用主键进行更新,因此速度非常快。如果任何更新失败,那么您可以通过在日志文件或错误表中注销失败的记录主键来了解哪些记录失败。我已经多次使用这种方法来更新PROD数据库中的数百万条记录,因为这是非常安全的方法。