Должен ли javax.persistence.SequenceGenerator.allocationSize() соответствовать INCREMENT BY?

У меня проблема с использованием свойства Hibernate javax.persistence.SequenceGenerator.allocationSize(). Когда для него установлено значение 1, я сталкиваюсь с проблемами производительности при вставке большого количества записей в базу данных. В противном случае, когда я устанавливаю его по умолчанию (50) или даже выше, я получаю исключения, что объект с указанным идентификатором уже существует!

Самая большая проблема заключается в том, что многие разработчики используют общую базу данных, поэтому вполне возможно, что сгенерированные идентификаторы не будут синхронизированы.

С другой стороны, я заметил, что последовательность Oracle создана с использованием «INCREMENT BY 1». Может быть, установка этого параметра в соответствии сlocationSize может решить проблему?

Я использую WildFly 10.1 (поэтому версия Hibernate — 5.0.10) и Oracle 12c (12.2.0.1).

Заранее спасибо за предложения!


person Dmitry Kruglikov    schedule 26.12.2017    source источник
comment
Да. Если они не одинаковы, вы получаете эту проблему. Increment by — это параметр базы данных для последовательности, а свойствоlocationSize — это значение JPA, которое сообщает ему, сколько чисел он может использовать, прежде чем он должен будет вернуться к последовательности для большего.   -  person Chris    schedule 26.12.2017


Ответы (1)


Да, значение allocationSize вашего SequenceGenerator и шаги, в которых ваша база данных увеличивает последовательность, должны быть идентичными.

Если вы установите для атрибута allocationSize значение 50, вы сообщите Hibernate, что последовательность увеличивается на 50 и что он должен сгенерировать 49 внутренних значений, прежде чем он выберет следующее значение из последовательности.

И вам не нужно беспокоиться о повторяющихся идентификаторах, если вы синхронизируете allocationSize и приращение последовательности.

скажем; у вас есть 2 сервера, которые подключаются к одной и той же базе данных. Оба сервера используют allocationSize из 50, и вы настроили последовательность своей базы данных для увеличения на 50.

Сервер 1 запрашивает новое значение из последовательности и получает 1000. Он сохранит это значение внутри и будет увеличивать его, пока не достигнет 1049.

Тем временем Server2 запрашивает новое значение из последовательности и получает 1050. Он будет увеличивать это значение до 1099.

Следующим значением, возвращаемым последовательностью базы данных, будет 1100. Как видите, повторяющихся идентификаторов не будет. Но между значениями первичного ключа могут быть промежутки, и вы не можете использовать их для хронологического упорядочения записей базы данных. Но вы все равно не должны использовать для этого первичные ключи...

person Thorben Janssen    schedule 27.12.2017