Spring中sequence的使用小结

1).简单介绍

sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。
  1、 create sequence
  你首先要有create sequence或者create any sequence权限
  create sequence emp_sequence
  INCREMENT BY 1 -- 每次加几个
  START WITH 1 -- 从1开始计数
  NOMAXVALUE -- 不设置最大值
  NOCYCLE -- 一直累加,不循环
  CACHE 10;
  一旦定义了emp_sequence,你就可以用CURRVAL,NEXTVAL
  CURRVAL=返回sequence的当前值
  NEXTVAL=增加sequence的值,然后返回sequence值
  比如:
  emp_sequence.CURRVAL
  emp_sequence.NEXTVAL
  可以使用sequence的地方:
  - 不包含子查询、snapshot、VIEW的 SELECT 语句
  - INSERT语句的子查询中
  - NSERT语句的VALUES中
  - UPDATE 的 SET中
  可以看如下例子:
  INSERT INTO emp VALUES
  (empseq.nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20);
  SELECT empseq.currval FROM DUAL;
  但是要注意的是:
  - 第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。CURRVAL 总是返回当前sequence的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次sequence的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。
  - 如果指定CACHE值,oracle就可以预先在内存里面放置一些sequence,这样存取的快些。
  cache里面的取完后,oracle自动再取一组到cache。 使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。
  2、 Alter sequence
  你或者是该sequence的owner,或者有ALTER ANY sequence权限才能改动sequence。 可以alter除start值之外的所有sequence参数。如果想要改变start值,必须drop sequence再re-create。例子:
  ALTER sequence emp_sequence
  INCREMENT BY 10
  MAXVALUE 10000
  CYCLE -- 到10000后从头开始
  NOCACHE;
  影响sequence的初始化参数:
  sequence_CACHE_ENTRIES =
  设置能同时被cache的sequence数目。
  可以很简单的Drop sequence
  DROP sequence order_seq;



2).在Spring的applicationContext中配置sequence
先要配置好一个dataSource,再配置sequence。如下,其中“SQ_AUTHFLOW”是需要使用的sequence的名字
	<!-- 配置Orcale/sequence -->
	<bean id="sequence"
		class="org.springframework.jdbc.support.incrementer.OracleSequenceMaxValueIncrementer">
		<property name="incrementerName" value="SQ_AUTHFLOW" />
		<property name="dataSource" ref="dataSource" />
	</bean>


3).在程序中使用实例
public class TAuthFlowDAOImp implements TAuthFlowDAO {	
	private OracleSequenceMaxValueIncrementer sequence;
	public OracleSequenceMaxValueIncrementer getSequence() {
		return sequence;
	}
	public void setSequence(OracleSequenceMaxValueIncrementer sequence) {
		this.sequence = sequence;
	}	
	public String save(final TAuthFlow tAuthFlow) {		
		..
		..
		OracleSequenceMaxValueIncrementer sequence = (OracleSequenceMaxValueIncrementer) AppContext.appContext.getBean("sequence");
		String irc = String.valueOf(sequence.nextIntValue());
		irc = StringUtils.leftPad(irc, 12, "0");  //将irc不足补0成为12位字符串
		SimpleDateFormat sdf11 = new SimpleDateFormat("yyyyMMdd");
		String NowDate = sdf11.format(new Date());
		String SeqNo = NowDate + irc;
		final String IfSvrFlow = SeqNo;
		..
		..
		return SeqNo;		
	}
}
其中AppContext.appContext.getBean("sequence")是另写的一个一次定义其后多次应用。


你可能感兴趣的:(spring,oracle,数据库,cache,String,insert)