Можете ли вы получить результаты расширенной трассировки SQL вашего запроса, чтобы увидеть, что JDBC делает под прикрытием? Я подозреваю, что он пытается сделать
UPDATE COUNTRIES SET NAME = '__TEST__' WHERE ROWID = :rowid_fetched
и ROWID означает что-то совершенно другое в Oracle IOT; это не неизменный адрес строки, а предположение относительно пути к строке.
Моя рекомендация относительно того, как это сделать, заключается в том, чтобы распространить сгенерированное системой поле отметки времени на все ваши таблицы и использовать его для управления параллелизмом, а не для объявления обновляемого набора записей - который будет принимать и удерживать блокировки для каждой записи в набор записей.
Тогда ваше приложение будет извлекать набор строк как обычно, но выдает операторы вроде:
UPDATE COUNTRIES SET NAME = '__TEST__' WHERE MOD_TS = :mod_ts_fetched
для создания оптимистической блокировки без сохранения состояния.