В моей программе большая коллекция - около 3 млн. Объектов.В течение всего жизненного цикла приложения мне необходимо регулярно обновлять эту коллекцию.Я ищу способ эмулировать уровень изоляции «read commited» из ACID.
Для пояснения, коллекция может иметь несколько строк, принадлежащих одному и тому же объекту.Когда выполняется обновление, все строки коллекции одного и того же объекта должны обновляться одновременно, поэтому никакая другая транзакция из другого потока не может прочитать какие-либо частичные обновления.Структура коллекции не позволяет заменять все записи одной и той же сущности одной операцией, т. Е. Идентификатор сущности не является, например, ключом на карте.
В настоящее время вместо инкрементного обновленияЯ выполняю полную перезагрузку коллекции, то есть сначала генерирую новую коллекцию для всех сущностей, а затем меняю местами.Примерно так:
private volatile Map<...> db = new HashMap<>();
...
void synchronized update() {
var tmpDb = new HashMap<>();
// populate tmpDb then swap
db = tmpDb;
}
Работает, но занимает слишком много памяти (хотя, позже, конечно, сборщик мусора).
Я знаю, например, что H2 имеет базы данных в памяти и имеет Transaction support (read committed)
в качестве функции.Интересно, как это реализовано под капотом.Может быть, я могу использовать тот же подход.