В проекте используется база данных PostgreSQL, управляемая через EclipseLink.
Горизонтальное масштабирование планируется путем перехода на сегментированный Postgres Pro Shardman.
В настоящее время первичным ключом каждой таблицы является поле уникального идентификатора. При переходе к распределенной системе возникает необходимость добавления дополнительного поля seg, обозначающего уникальный номер конкретного узла базы данных.
Например, есть 3 сервера:
- Все записи в таблицах на первом сервере будут содержать только значение 0 в поле seg.
- На втором сервере значение 1
- На третьем значение 2 и так далее.
Код: Выделить всё
SELECT * FROM table WHERE id = 1000;
Код: Выделить всё
SELECT * FROM table WHERE seg = 0 AND id = 1000;
Проблема:
Поскольку текущая база данных представляет собой простой PostgreSQL, все запросы в проекте, включающие предложения WHERE и JOIN, используют только поле id.
Добавление дополнительных предложений вручную с помощью поля seg очень сложно трудоемкая задача и подвержена множеству неожиданных ошибок.
Вместо этого решением было сохранить значение поля seg непосредственно в первых 8 битах поля id.
Предположим, начальные значения полей:
Код: Выделить всё
seg = 3
id = 1000
Код: Выделить всё
id = id
Подробнее здесь: [url]https://stackoverflow.com/questions/79877127/java-eclipselink-is-it-possible-to-add-additional-conditions-to-sql-queries-usi[/url]
Мобильная версия