【发布时间】:2012-04-18 15:10:08
【问题描述】:
我可以通过 JPA 或在数据库级别为数据库表主键设置一个 MAX 值吗?如果不可能,那我在考虑
- 在 0-9999999999 之间创建一个随机
key(9999999999 是我的最大值) - 用新创建的
key对数据库进行SELECT,如果返回对象是null,则INSERT,如果不重复返回步骤1
因此,如果我执行上述操作,有两个问题。请记住,环境是高并发的:
Q1:使用 SELECT(如果不存在)进行检查的开销是否显着?我真正的意思是:这个过程正常吗,因为通常我让DB为我创建一个独特的PK?
Q2:如果 Q1 没有造成显着的性能下降,我会遇到并发问题吗?例如,如果 P1 用 Id1 查表,Id1 不存在,它准备插入,P2 在 P1 可以之前偷偷插入 Id1。所以当 P1 插入 Id1 时,它会失败。我不希望这个过程在这里失败,我希望它回到循环,找到一个新的 id,重复这个过程。我该怎么做?
我的环境是 SQL 和 MYSQL db。我使用 JPA 和 Eclipselink 实现
注意:有些人质疑我以这种方式实现它的决定,答案正是TravisJ 下面的建议。我有一个非常高的并发环境。当一个进程启动时,我需要向另一个进程创建一个请求,向该进程传递一个唯一的 10 个字符长的 ID。由于环境是大电流,我想利用 PK 的独特而非空特性。请求中包含大量信息,因此我创建了一个Request 表,请求 ID 作为我的 PK。我知道,由于所有数据库都索引他们的 PK,因此查询出 PK 的速度很快。如果有更好的方法,请告诉我。
【问题讨论】:
-
你为什么要做这样的事情?
-
几乎不存在没有你想要的理由。看起来你在滥用PK的角色,这表明你做错了什么。长话短说:不要这样做。
-
我不同意没有理由。这可以用来为主键创建某种散列。提出的主要问题似乎是竞争条件,这意味着不同的进程需要一个信号量。
标签: java mysql sql jpa eclipselink