实体类的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, ...
。再次,它工作正常。它永远不会导致冲突。但为什么这个奇怪的命令?
答案 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,...
检查序列
的attibuteORDER_FLAG
select SEQUENCE_NAME, ORDER_FLAG from user_sequences;
你很可能会看到'N'。
你可以抑制这种无序分配,将seqeunce设置为ORDER
分配,但要做好准备,它也能有效地抑制缓存(并可能导致争用)。
alter sequence seq1 order;