Я изо всех сил пытаюсь получить голову вокруг, как генератор Хило работает в 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
Я считаю, что ваше понимание более или менее правильное. Параметр max_lo просто используется для определения количества идентификаторов, доступных для любого заданного Hi ценить.
Я предполагаю, что значение max_lo по умолчанию для NHibernate равно 32768. Таким образом, значение Hi, равное 1, будет запускать ваши идентификаторы с 32768 и довести вас до 65535. Значение Hi, равное 2, будет начинаться с 65536 и запускать другие идентификаторы max_lo. .
В основном вы используете значение max_lo для управления фрагментацией Id. 32768, вероятно, не является оптимальным значением для каждой ситуации.
Однако важно отметить, что это работает только в рамках SessionFactory. Если вы останавливаете / запускаете свое приложение и повторно инициализируете SessionFactory целую кучу, оно все равно увеличит значение Hi при запуске, и вы увидите, что ваши идентификаторы довольно быстро прыгают.