Критерии Nhibernate: 'выберите макс. (идентификатор) …'

Если Вы, которых Вы используете session_set_save_handler () , можно установить собственный обработчик сессий. Например, Вы могли сохранить свои сессии в базе данных. Обратитесь к комментариям php.net для примеров обработчика сессий базы данных.

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

9
задан AwkwardCoder 14 August 2009 в 14:43
поделиться

2 ответа

Использовать Прогноз :

session.CreateCriteria(typeof(Customer))
  .SetProjection( Projections.Max("Id") )
  . UniqueResult();
23
ответ дан 4 December 2019 в 06:26
поделиться

Макс. (Id) + 1 - очень плохой способ генерировать идентификаторы. Если это ваша цель, найдите другой способ сгенерировать идентификаторы.

Изменить: в ответ на LnDCobra:

это плохо, потому что трудно убедиться, что максимальный (id), который вы получили, по-прежнему является максимальным (id), когда вы делаем вставку. Если другой процесс вставляет строку, ваша вставка будет иметь тот же идентификатор, и ваша вставка не удастся. (Или, наоборот, вставка другого процесса завершится ошибкой, если ваша вставка произойдет первой.)

Чтобы предотвратить это, вы должны предотвратить любые другие вставки / сделать ваши get и последующие вставки атомарными, что обычно означает блокировку таблицы, что приведет к повредить производительность.

Если вы заблокируете только запись, другой процесс получит max (id), который будет таким же max (id), который вы получили. Вы делаете свою вставку и снимаете блокировку, она вставляет повторяющийся идентификатор и терпит неудачу. Или он тоже пытается заблокироваться, в этом случае он ждет вас. Если вы тоже заблокируете чтение, все будут ждать вас. Если он также блокируется от записи, то он не вставляет повторяющийся идентификатор, но он ожидает вашего чтения и записи.

(И это нарушает инкапсуляцию: вы должны позволить rdbms определить его идентификаторы, а не клиенту программы, которые подключаются к нему.)

Как правило, эта стратегия будет либо:
* перерыв
* требуется связка "сантехнического" кода, чтобы он работал
* значительно снизить производительность
* или все три

, и он будет медленнее, менее надежен и требует более сложного сопровождения кода, чем просто использование встроенных последовательностей РСУБД или сгенерированных идентификаторов автоинкремента.

15
ответ дан 4 December 2019 в 06:26
поделиться
Другие вопросы по тегам:

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