2010-05-26 80 views
0

如何對批量更新使用樂觀鎖定?我正在使用SimpleJdbcTemplate和單行我可以構建更新sql增加版本列值,幷包括在WHERE子句中的版本。樂觀鎖定批量更新

不幸的是,使用oracle驅動程序時,結果int[] updated = simpleJdbcTemplate.batchUpdate不包含行計數。所有元素均爲-2,表示未知的行數。

是否有一些其他更高性能的方法比單獨執行所有更新?這些批次包含平均5項(僅),但可能高達250.

回答

2

只是在這裏大聲思考 - 如果它是在驅動程序批處理支持的問題,您可以嘗試使用單個查詢來實現相同,使批次不那麼重要。 (如你所知,配料是關於避免與多個查詢延遲,但延遲仍是配料單查詢,即使存在。)

這裏是你如何與一個單一的查詢

  • 構建實現樂觀更新一個臨時表,其中包含行更新所需的條件,並將更新查詢重寫爲此表上的聯接。 (例如,外部實時數據中的當前時間戳與臨時表中的時間戳結合使用。)如果實時數據上的時間戳未更新,則將從臨時表中選擇該行。

既然您可以使用臨時表作爲選擇查詢,您可以找到哪些行將被更新,然後將其作爲更新查詢提交。 (所有內部事務,當然。)

舉例說明:

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)