1

在我的 Web 应用程序中,我得到了Concurrency ProblemJPA ID Generation。我使用Table生成策略。我已经得到JPA ID Generation 的并发问题

如何避免Concurrency ProblemJPA ID 生成?ID生成的更好方法是什么?Spring 3.0 有办法避免吗?

实际上,如果我使用其他 id 生成策略,我会担心数据库依赖性。

4

4 回答 4

4

EclipseLink 通常会使用单独的事务来分配生成的 id。如果您使用 JTA 数据源,则它不能,除非您还在 persistence.xml 中提供了非 jta 数据源。

此外,如果您提前触发数据库事务(例如刷新),则表 ID 生成将不得不使用事务连接,除非您指定序列连接池。

见, http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/p_connection_pool_sequence.htm#BABIDAGH

于 2013-01-15T14:26:14.967 回答
2

在 Oracle 中,您可以使用自治事务并创建存储过程,如下所示:

CREATE OR REPLACE PROCEDURE GETAPPLICATIONSEQUENCE (
name IN VARCHAR,
offSet IN NUMBER,
seqValue OUT INTEGER
)
AS PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    SELECT sequence_value INTO seqValue FROM sequence_table WHERE sequence_name = name FOR UPDATE;
    UPDATE sequence_table SET sequence_value = sequence_value + offSet WHERE sequence_name = name;
    COMMIT;
END;

现在,只要您能够从数据库代码中调用此存储过程,您就可以传入所需序列的名称和偏移量(以在一个块中获取多个值)并获取序列值。您将不得不查看 SQL Server 是否具有与 AUTONOMOUS 事务等效的功能。

于 2013-01-16T18:04:18.610 回答
1

正如该链接所说,一些 JPA 提供程序使用单独的连接来生成值(DataNucleus JPA确实如此)。所以这回避了这个问题。取决于您的 JPA 提供程序(您没有说明)。

于 2013-01-15T08:58:34.280 回答
0

那么您不应该依赖数据库来生成您的 ID。您可以UUID用作您的钥匙。它们可以彼此独立生成,因此您不会遇到并发问题。但是,您可能必须更改数据库架构以支持它,因为 UUID 的 128 位可能不适合您当前的主键列。

于 2013-01-15T07:18:53.667 回答