在我的 Web 应用程序中,我得到了Concurrency Problem
JPA ID Generation。我使用Table
生成策略。我已经得到JPA ID Generation 的并发问题。
如何避免Concurrency Problem
JPA 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 位可能不适合您当前的主键列。