Я хочу перебрать записи в базе данных и обновить их.Однако, поскольку это обновление занимает некоторое время и подвержено ошибкам, мне нужно: а) не заставлять db ждать (как, например, с ScrollableResults
) и б) фиксировать после каждого обновления.Во-вторых, это делается в нескольких потоках, поэтому я должен убедиться, что, если поток A заботится о записи, поток B получает другую.Как я могу реализовать это разумно с Hibernate?
Чтобы дать лучшую идею, следующий код будет выполняться несколькими потоками, где все потоки совместно используют один экземпляр RecordIterator
:
Iterator<Record> iter = db.getRecordIterator();
while(iter.hasNext()){
Record rec = iter.next();
// do something lengthy here
db.save(rec);
}
Так что мой вопрос в том, как реализовать RecordIterator
.Если на каждом next()
я выполняю запрос, как обеспечить, чтобы я не возвращал одну и ту же запись дважды?Если нет, какой запрос использовать для возврата отдельных объектов?Есть ли недостаток в общем подходе (например, использовать один RecordIterator
на поток и позволить БД как-то обрабатывать синхронизацию)?Дополнительная информация: существует множество способов локально хранить их (например, в наборе обработанных записей).
Обновление: Поскольку весь процесс занимает некоторое время, может случиться, чтостатус записей меняется.В связи с этим порядок следования запроса может измениться.Я думаю, чтобы решить эту проблему, я должен пометить записи в базе данных, как только я возвращаю их для обработки ...