java - 乐观锁批量更新

标签 java jdbc optimistic-locking

如何使用乐观锁定进行批量更新?我正在使用 SimpleJdbcTemplate,对于单行,我可以构建更新 sql,它会增加版本列值并在 WHERE 子句中包含版本。

不幸的是,使用 Oracle 驱动程序时,结果 int[] Updated = simpleJdbcTemplate.batchUpdate 不包含行计数。所有元素均为 -2,表示行数未知。

是否有其他比单独执行所有更新更高效的方法?这些批处理平均包含 5 个项目(仅),但可能最多 250 个。

最佳答案

在这里大声思考 - 如果驱动程序中的批处理支持存在问题,您可以尝试使用单个查询来实现相同的目的,从而使批处理的相关性降低。 (如您所知,批处理是为了避免多个查询的延迟,但即使批处理单个查询,延迟仍然存在。)

以下是如何通过单个查询实现乐观更新

  • 构建一个临时表,其中包含行更新所需的条件,并将更新查询重写为该表的联接。 (例如,将实时数据中的当前时间戳与临时表中的时间戳进行外连接。)如果实时数据上的时间戳尚未更新,则将从临时表中选择该行。

由于您可以使用临时表作为选择查询,因此您可以找到将更新哪些行,然后将其作为更新查询提交。 (当然,所有这些都在一次交易中。)

举例说明:

TempUpdateTable
---------------
id,        // id of the row to be updated
timestamp, // timestamp data originally fetched
data1      // data to be updated
data2
dataN

这给出了所有要更新的数据的 ID,您可以存储这些数据以供以后引用

SELECT d.id FROM TempUpdateTable t JOIN YourData d 
    ON t.id=d.id WHERE t.timestamp=d.timestamp

然后可以在更新语句中使用相同的查询

UPDATE YourData
SET data=t.data1
SET data=t.data2  //etc...
FROM TempUpdateTable t WHERE t.id IN
  (SELECT d.in FROM TempUpdateTable t JOIN YourData d 
    ON t.id=d.id WHERE d.timestamp=d.timestamp)

关于java - 乐观锁批量更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2910715/

相关文章:

使用 jdbc url 的 MySQL 主/从复制

jdbc - 找不到JDBC驱动程序类:com.mysql.jdbc.Driver

java - 如何引发 OptimisticLockException

android - 想要每 20 秒重复一次闹钟

java - 定时器服务 EJB 3.0 与 EJB 3.1

java.lang.IllegalArgumentException : Removing a detached instance of StudentSubject

java - 如何在java程序中运行不同的java程序?

java - 当引用的非外键列为 null 时,Hibernate 将一对多集初始化为 null

java - 如何根据外键从引用表中获取值?

mysql - 带/不带版本的 Hibernate 乐观锁不起作用