在我的 Web 应用程序中,我得到了Concurrency ProblemJPA ID Generation。我使用Table生成策略。我已经得到JPA ID Generation 的并发问题。
如何避免Concurrency ProblemJPA ID 生成?ID生成的更好方法是什么?Spring 3.0 有办法避免吗?
实际上,如果我使用其他 id 生成策略,我会担心数据库依赖性。
EclipseLink 通常会使用单独的事务来分配生成的 id。如果您使用 JTA 数据源,则它不能,除非您还在 persistence.xml 中提供了非 jta 数据源。
此外,如果您提前触发数据库事务(例如刷新),则表 ID 生成将不得不使用事务连接,除非您指定序列连接池。
在 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 事务等效的功能。
正如该链接所说,一些 JPA 提供程序使用单独的连接来生成值(DataNucleus JPA确实如此)。所以这回避了这个问题。取决于您的 JPA 提供程序(您没有说明)。
那么您不应该依赖数据库来生成您的 ID。您可以UUID用作您的钥匙。它们可以彼此独立生成,因此您不会遇到并发问题。但是,您可能必须更改数据库架构以支持它,因为 UUID 的 128 位可能不适合您当前的主键列。