1

首先,我使用 jdbc 驱动程序在 java 中运行所有这些...

这里我定义了一个表:

create table HistoryCCP(
  ID     NUMBER(6)      NOT NULL,
  SCRIPT VARCHAR2(1000) NOT NULL
 )

这里我定义了一个序列:

CREATE SEQUENCE SYSTEM.HistoryId  
   MINVALUE  1 
   MAXVALUE 1000000 
   INCREMENT BY 1 
   START WITH 1  
   NOORDER   
   NOCYCLE

现在我在这里使用它插入表:

insert into HistoryCCP 
  values (SYSTEM.HistoryId.nextval ,'HELLOOOO  ')

每当我关闭程序并再次运行它并尝试插入时,它都会增加十!当我这样定义序列时:

CREATE SEQUENCE SYSTEM.HistoryId  
   MINVALUE  1 
   MAXVALUE 1000000 
   INCREMENT BY 1 
   START WITH 1
   CACHE 100       -- added cache parameter
   NOORDER   
   NOCYCLE

它增加了100!你知道它为什么会有这样的行为以及如何将它增加 1 吗?

4

3 回答 3

6

永远不要依赖序列进行无间隙编号。

缓存值是数据库服务器在内存中保存的序列值的数量,以避免需要使用最近使用的值不断更新其内部 $SEQ 表。如果您减少缓存值,那么您将增加必须修改 $SEQ 表的速率,这会减慢系统速度。

缓存的值可能会过期,并且会在系统重新启动时丢失,并且如果事务回滚,则不会重用这些值。

间隙的存在对您来说应该不是问题——如果是,那么您将需要使用序列以外的东西来生成数字,这样做会将插入序列化到该表中。

于 2013-10-16T11:22:22.243 回答
0

尝试对序列使用 NOCACHE 选项。

http://docs.oracle.com/cd/B28359_01/server.111/b28310/views002.htm

于 2013-10-16T11:16:31.620 回答
0

NOCACHE 会起作用,但由于许多原因,这也是一个坏主意,如果您打算将应用程序放在 Oracle RAC 上,那完全是一派胡言。

Oracle 序列适用于(内部)唯一 ID,而不适用于要求强加的严格累进数字。例如,假设使用序列生成经典的“协议编号”是许多财务会计软件的常见缺陷:开始时看起来很容易,但当项目发展时,它会杀死你。

于 2013-10-17T09:32:33.193 回答