NHibernate Hi / Lo - пробелы в идентификаторах - PullRequest
2 голосов
/ 04 мая 2011

Сценарий: Hi / Lo инициализируется для MyEntity с Lo 100

Таблица пуста.

В двух сеансах с разными подключениями оба вставили три элемента.

TableIds

1
2
3
100
101
102

Если третий приходит позже и вставляет три элемента:

TableIds

...
200
201
202

Есть ли способ не получить эти пробелы?

Ответы [ 2 ]

4 голосов
/ 04 мая 2011

Значение Lo хранится в SessionFactory, а не в Session. Пробелы появляются только при перезапуске приложения и создании нового экземпляра SessionFactory.

Новое значение Hi извлекается из базы данных и сохраняется в SessionFactory, поэтому, если у вас есть веб-ферма, у каждого сайта будет свой экземпляр SessionFactory, каждый из которых будет иметь свое собственное «следующее» значение Hi из базы данных. , Когда у него заканчиваются значения Lo, он обновляет Hi до следующего доступного Hi из базы данных.

Edit:

Если у вас есть клиентские приложения, я бы порекомендовал вообще не использовать HiLo, вместо этого использовать GuidComb, это последовательный Guid, и у вас не будет проблем с пробелами.

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

Если вы не можете этого сделать, вам придется понизить свою Lo.

2 голосов
/ 04 мая 2011

Как правильно заметил Phill, при построении sessionFactory, например, появляются пробелы. приложение перезапускается и т. д., или вы работаете в облаке, и каждый узел имеет свой собственный набор Hi и lo.

Вы можете уменьшить значение lo до 10 вместо 100, чтобы уменьшить пробелы, и / или я рекомендую использовать int64 вместо int32 для удобства.

Однако действительно ли эти пробелы имеют значение? Ты когда-нибудь видел, чтобы у тебя кончились дела?

Я никогда не читал ничего негативного о производительности (проблемы с базой данных) с большим количеством пробелов при использовании Hilo. Единственное, что я видел, это то, что некоторые люди жалуются на то, что у них заканчивается использование int32 или когда lo был установлен на высокий уровень.

...