Q1. : В чем разница между применением идентификатора последовательности в базе данных с использованием
A.
CREATE TABLE Person
(
id long NOT NULL AUTO_INCREMENT
...
PRIMARY KEY (id)
)
по сравнению с
B.
@Entity
public class Person {
@Id
@TableGenerator(name="TABLE_GEN", table="SEQUENCE_TABLE", pkColumnName="SEQ_NAME",
valueColumnName="SEQ_COUNT", pkColumnValue="PERSON_SEQ")
@GeneratedValue(strategy=GenerationType.TABLE, generator="TABLE_GEN")
private long id;
...
}
Моя система высокопараллельна . Поскольку моя БД является сервером Microsoft SQL, я не думаю, что он поддерживает @SequenceGenerator
, поэтому я должен оставаться с @TableGenerator
, который подвержен проблемам параллелизма.
В2. Эта ссылка здесь ( http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Advanced_Sequencing) предполагает, что Bмогут страдать от проблем с параллелизмом, но я не понимаю предлагаемого решения. Я был бы очень признателен, если бы кто-нибудь объяснил мне, как избежать проблем параллелизма с B. Вот фрагмент их решения:
Если используется большой размер предварительного выделения последовательности, это становится менее проблемой, поскольку доступ к таблице последовательности осуществляется редко.
Q2.1: О каком размере распределения идет речь? Должен ли я делать locationSize=10
или locationSize=100
?
Некоторые провайдеры JPA используют отдельное (не JTA) соединение для выделения идентификаторов последовательностей, избегая или ограничивая эту проблему. В этом случае, если вы используете соединение с источником данных JTA, важно также включить в файл persistence.xml соединение с источником данных, отличным от JTA.
Q2.2: Я использую EclipseLink в качестве провайдера; я должен делать то, что он предлагает выше?
В3. Если Bстрадает от проблем с параллелизмом, Aстрадает тем же?