2010-05-26 2 views
0

Как использовать оптимистичную блокировку с пакетными обновлениями? Я использую SimpleJdbcTemplate, и для одной строки я могу построить sql update, который увеличивает значение столбца версии и включает версию в предложение WHERE.оптимизация блокировки пакетного обновления

К сожалению, результат int[] updated = simpleJdbcTemplate.batchUpdate не содержит количество строк при использовании драйвера oracle. Все элементы - -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 

Это дает идентификаторы всех данных, которые будут обновлены, которые можно хранить для последующего использования

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)