Блокировка базы данных в Spring Batch

Я работаю над приложением Spring Batch, которое запускалось в тупик DB2 при использовании JdbcCursorItemReader по умолчанию. Когда пакетное задание столкнулось с ошибкой, мы настроили SkipListener для записи состояния «Ошибка» в соответствующую строку, когда возникла взаимоблокировка.

Мы обнаружили, что, используя JdbcPagingItemReader по умолчанию, мы смогли избежать сценария взаимной блокировки, хотя мы не совсем уверены, почему это так.

Мое понимание Spring Batch заключается в том, что любой Reader должен был освободить блокировку базы данных после того, как ResultSet был прочитан из запроса, но этого не произошло с JdbcCursorItemReader.

Может ли кто-нибудь помочь мне понять, почему это так?

Спасибо!


person KAM1KAZEKOALA    schedule 21.11.2018    source источник
comment
Вероятно, это связано с драйвером JDBC для DB2 (не проблема Spring Batch). Я приглашаю вас прочитать комментарии в jira.spring.io/browse/BATCH-1273 (хотя в нем говорится о XA, который, вероятно, не является вашим вариантом использования, но все же связан с ним). Курсоры — это просто плохая идея на некоторых платформах. как упоминал Дэйв Сайер.   -  person Mahmoud Ben Hassine    schedule 22.11.2018


Ответы (1)


JdbcCursorItemReader будет поддерживать позицию (курсор) в базе данных, чтобы знать, откуда читать дальше. Этот курсор поддерживается замком. JdbcPageItemReader, по-видимому, отправляет запросы, запрашивающие данные из известной начальной и конечной точек, так что он считывает данные только между этими двумя точками и не требует блокировок между вызовами.

person Quentin Presley    schedule 07.11.2019