Q1.: В чем разница между применением идентификатора последовательности в базе данных с помощью
а.
CREATE TABLE Person
(
id long NOT NULL AUTO_INCREMENT
...
PRIMARY KEY (id)
)
против
В.
@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
, который подвержен проблемам concurrency.
Q2. Эта ссылка здесь (http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Advanced_Sequencing) предполагает, что B может пострадать от concurrency но я не понимаю предлагаемого решения. Я был бы очень признателен, если бы кто-нибудь мог объяснить мне, как избежать проблем concurrency с B. Вот фрагмент их решения:
If a large sequence pre-allocation size is used this becomes less of an issue, because the sequence table is rarely accessed.
Q2.1. Как мы выделяем размер выделения? Должен ли я делать allocationSize=10
или allocationSize=100
?
Some JPA providers use a separate (non-JTA) connection to allocate the sequence ids in, avoiding or limiting this issue. In this case, if you use a JTA data-source connection, it is important to also include a non-JTA data-source connection in your persistence.xml.
Q2.2. Я использую EclipseLink в качестве моего провайдера; мне нужно делать то, что он предлагает выше?
Q3. Если B страдает от проблем concurrency, имеет ли A то же самое?