Oracle DB + Hibernate

时间:2016-02-11 17:41:19

标签: oracle hibernate

实体类的Hibernate注释如下所示:

@Entity
@Table(name = "MY_ENTRY")
@SequenceGenerator(name="SEQ_MY_ENTRY_ID", allocationSize=1, sequenceName="SEQ_MY_ENTRY_ID")
public class MyEntry {

@Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_MY_ENTRY_ID")
private Long id;

...

Oracle DB的SQL如下所示:

CREATE SEQUENCE  "SEQ_MY_ENTRY_ID" MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1541 CACHE 20 NOORDER  NOCYCLE;

一切正常!

我只是想知道为什么生成的ID似乎处于混乱状态。我期待1148, 1149, 1150, ...之类的东西。但相反,我得到了这个:1148, 1165, 1166, 1181, 1167, 1149, 1150, 1182, 1151, 1168, 1152, 1153, 1183, 1154, ...。再次,它工作正常。它永远不会导致冲突。但为什么这个奇怪的命令?

1 个答案:

答案 0 :(得分:2)

您描述的行为,即无序ID表明您已连接到RAC数据库。

您可以使用查询

进行验证
select name, value from v$parameter where name='cluster_database'; 

如果VALUE为TRUE,则表示您已连接到RAC。在这种情况下,每个实例分配其自己的缓存间隔,并且取决于调用NEXTVAL的实例,返回不同的rance。因此,如果你有两个实例,第一个缓存1到20,秒21到40,你可以得到例如1,2,21,3,4,22,23,...

检查序列

的attibute ORDER_FLAG
select SEQUENCE_NAME, ORDER_FLAG from user_sequences;

你很可能会看到'N'。

你可以抑制这种无序分配,将seqeunce设置为ORDER分配,但要做好准备,它也能有效地抑制缓存(并可能导致争用)。

 alter sequence seq1 order;

其他信息herehere