Проблема с использованием идентификаторов @GeneratedValue
заключается в том, что для того, чтобы Hibernate поместил новый объект в контекст постоянства (кэш первого уровня), он должен знать идентификатор.Поэтому, когда вы используете идентификаторы на основе IDENTITY
или SEQUENCE
, это может повлиять на способность драйвера JDBC адекватно пакетировать операции вставки.
Например, вы показали, что большинство ваших сущностей используют следующеегенерация последовательности:
@SequenceGenerator(
name = "CHECKITEM_SEQ",
sequenceName = "CHECKITEM_SEQ",
allocationSize = 1)
Таким образом, когда бы ни происходила постоянная операция для объекта, вы указываете генератору последовательности генерировать только одно значение, поэтому связь JDBC выглядит следующим образом:
1. Get Next Sequence
2. Insert
3. Get Next Sequence
4. Insert
5. Get Next Sequence
6. Insert
Как видно здесь, мы не можем пакетировать операции вставки, потому что мы должны извлечь идентификатор для каждой операции вставки, прежде чем операция вставки может произойти.Одним из решений, позволяющих минимизировать это влияние и справиться с пакетными вставками, является использование большего allocationSize
.
1. allocationSize=10 -> Get Next 10 sequences
2 - 11. Perform 10 inserts in batch
Repeat
. Как вы видите, драйвер может выполнить 10 вставок в пакете, Hibernate распределяет последовательности в пакетахна 10 и так вставки могут происходить намного быстрее.
Очевидно, что это имеет небольшой недостаток, если вы выделяете 10 последовательностей, но оставшемуся пакету нужно только вставить 6 сущностей;вы потратили 4 значения последовательности, но вы получаете производительность благодаря возможности выполнения пакетных вставок jdbc.
Следующим логическим шагом будет определение того, можете ли вы исключить использование @GeneratedValue
все вместе какэто дало бы вам максимальную производительность с пакетными вставками для ваших операций копирования;однако это может быть невозможно с вашей моделью данных.В прошлом, когда я имел дело с перемещением больших объемов данных, я пытался определить первичный ключ на основе естественных ключей из данных, не используя суррогатный ключ, если это возможно.
Не стесняйтесь читать больше о пакетных операциях JDBC здесь .