Hibernate, какова наиболее эффективная стратегия генерации id?
Мне нужно вставить много объектов в базу данных через Hibernate. Итак, я хочу найти наиболее эффективный алгоритм для генерации Id.
соответственно Hibernate Документация существует четыре широко используемых стратегий поколения:
- личность
- последовательность
- стол
- авто
Я должен использовать базу данных MySQL, поэтому я не могу применить стратегию генерации последовательности. А как насчет других стратегий? Что? является наиболее эффективным с точки зрения производительности?
2 ответов
лучшие генераторы id в спящем режиме являются enhanced-table и расширенные-последовательности в сочетании с соответствующим оптимизатора, таких как хило. У меня есть опыт работы с enhanced-table + хило вставить более 10 000 записей в секунду.
кстати, утверждение ,что "hilo нуждается в дополнительном запросе на сгенерированный объект", явно ложно: весь смысл оптимизатора -запретить этот.
как вы не можете использовать SEQUENCE
и AUTO
просто автоматически выбирает поддерживаемый алгоритм генератора из существующих, вы остаетесь с IDENTITY
и TABLE
.
TABLE
: использует алгоритм hi/lo для эффективного генерирования идентификаторов типа long, short или int, учитывая таблицу и столбец в качестве источника значений hi. Алгоритм hi/lo генерирует идентификаторы, уникальные только для конкретной базы данных. -> Означает дополнительный запрос на сгенерированный сущность. (Это неверно, если вы используете оптимизаторы. К сожалению, по умолчанию не используется оптимизатор, если оптимизатор не указан.)IDENTITY
: поддерживает столбцы идентификаторов в DB2, MySQL, MS SQL Server, Sybase и HypersonicSQL. -> производительность-мудрый, это путь, так же, как и без спящего режима в обычном режиме. База данных сгенерирована, почти никаких накладных расходов.
существует больше спящего режима конкретные генераторы, но они не будут превосходить производительность по ID, сгенерированному базой данных. (См.5.1.2.2.1. Various additional generators
в документе по ссылке.)