Объяснение Хило NHibernate

Я изо всех сил пытаюсь получить голову вокруг, как генератор Хило работает в NHibernate. Я считал объяснение здесь, которое сделало вещи немного более ясными.

Мое понимание - то, что каждый SessionFactory получает высокое значение от базы данных. Это улучшает производительность, потому что у нас есть доступ к идентификаторам, не поражая базу данных.

Объяснение из вышеупомянутой ссылки также указывает:

Например, предположение Вас имеет "высокую" последовательность с текущим значением 35, и "низкое" количество находится в диапазоне 0-1023. Затем клиент может увеличить последовательность к 36 (чтобы другие клиенты смогли генерировать ключи, в то время как она использует 35), и знайте что ключи 35/0, 35/1, 35/2, 35/3... 35/1023 все доступны.

Как это работает в веб-приложении, поскольку у меня не только есть один SessionFactory и поэтому один привет значение. Это означает, что в разъединенном приложении можно закончить с дублирующимися (низкими) идентификаторами в таблице объекта?

В моих тестах я использовал эти настройки:


  

Я запустил тест для сохранения 100 объектов. Идентификаторы в моей таблице пошли от 32768 - 32868. Следующие привет оценивают, был увеличен к 2. Затем я запустил свой тест снова, и Ids были в диапазоне 65536 - 65636.

Прежде всего, почему запускаются в 32 768 а не 1, и во-вторых почему переход от 32 868 до 65 536?

Теперь я знаю, что мои суррогатные ключи не должны иметь никакого значения, но мы действительно используем их в нашем приложении. То, почему я не могу только сделать, чтобы они увеличили приятно как поле идентификационных данных SQL Server, было бы.

Наконец кто-то может дать мне объяснение того, как max_lo параметр работает? Действительно ли это - максимальное количество низких значений (идентификаторы объекта в моей голове), который может быть создан против высокого значения?

Это - одна тема в NHibernate, для которого я изо всех сил пытался найти документацию. Я считал весь NHibernate в книге действия, и это все еще не входит, как это работает во всех подробностях.

Спасибо Ben

34
задан Community 23 May 2017 в 10:34
поделиться

1 ответ

Я считаю, что ваше понимание более или менее правильное. Параметр max_lo просто используется для определения количества идентификаторов, доступных для любого заданного Hi ценить.

Я предполагаю, что значение max_lo по умолчанию для NHibernate равно 32768. Таким образом, значение Hi, равное 1, будет запускать ваши идентификаторы с 32768 и довести вас до 65535. Значение Hi, равное 2, будет начинаться с 65536 и запускать другие идентификаторы max_lo. .

В основном вы используете значение max_lo для управления фрагментацией Id. 32768, вероятно, не является оптимальным значением для каждой ситуации.

Однако важно отметить, что это работает только в рамках SessionFactory. Если вы останавливаете / запускаете свое приложение и повторно инициализируете SessionFactory целую кучу, оно все равно увеличит значение Hi при запуске, и вы увидите, что ваши идентификаторы довольно быстро прыгают.

21
ответ дан 27 November 2019 в 17:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: