Закончились HiLo-идентификаторы NHibernate, что привело к отрицательным числам - PullRequest
3 голосов
/ 31 января 2011

Мы запускаем приложение базы данных ASP.NET, которое использует HiLo для генерации идентификаторов для сущностей.Помимо этого приложения у нас есть несколько веб-сайтов, использующих одну и ту же базу данных.Мы видим, что у нас заканчиваются идентификаторы, и столбец идентификаторов становится отрицательным числом.

Мы подозреваем, что это как-то связано с генератором.Поскольку несколько веб-сайтов работают поверх одной и той же кодовой базы и базы данных, и, вероятно, алгоритм HiLo быстро начинает генерировать идентификаторы, которые находятся за пределами диапазона bigint (с быстрым относительным отношением, конечно).генератор таким образом, чтобы он также использовал промежутки (которых их довольно много) в Id-последовательностях, вместо того, чтобы прямо увеличивать значение всякий раз, когда он чувствует, что это необходимо?Или мы вообще должны заниматься чем-то другим?

Ответы [ 3 ]

1 голос
/ 02 июня 2011

на что настроено ваше max_lo? Формула для генерации идентификатора выглядит следующим образом

h = высокая последовательность (начиная с 0) l_size = размер нижнего блока l = низкая последовательность (начиная с 1)

ID = h * l_size + l

Может быть, ваш max_lo установлен на высокий?

0 голосов
/ 01 февраля 2011

Я столкнулся с той же проблемой и также не смог найти подходящий ответ.

У нас также есть сайт, который запускается как отдельные веб-сайты, каждый из которых находится в отдельном пуле приложений, и все на одном веб-сервере.

Прагматично, вам было бы лучше просто переключитьсяна отображение личности, если ваша база данных поддерживает это.Это не должно быть слишком сложно, вы должны иметь возможность изменить схему базы данных с небольшим количеством TSQL и сопоставления идентификаторов с небольшим количеством поиска / замены.

Есть ли у вас концепция, похожая на UoWв вашем приложении?Потому что недостатком генерации идентичности является то, что она сломает UoW (ранние вставки, чтобы получить идентификатор).Хотя это может быть цена, которую стоит заплатить.

В моем случае система может легко существовать как один пул сайта / приложения (она мультитенантна в одной базе данных, с единой общей строкой соединения и предназначеназапускаться как один экземпляр на веб-сервере), поэтому я собираюсь проверить это, прежде чем перейти к идентификаторам базы данных ..

0 голосов
/ 01 февраля 2011

Вы можете переключиться на генератор Guid.Comb , если это возможно, или использовать int64 для идентификаторов.Взгляните здесь для принятия окончательного решения относительно того, какой генератор использовать.

...