В чем разница между: идентификатором последовательности с использованием JPA @TableGenerator, @GeneratedValue и Auto_Increment базы данных

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страдает тем же?

14
задан Miguel Ping 16 April 2012 в 12:49
поделиться