クラスタ環境流水番号設計

2478 ワード

構想:データベースの排他ロックメカニズムを利用して、クラスタ流水号生成の唯一性を達成する
 
流水番号表:
 
表名:SYS_IDENTITY解釈:SYS_IDENTITY【流し番号生成】備考:流し番号生成
SYS_IDENTITY(SYS_IDENTITY【流し番号生成】)
プライマリ・キー
フィールド名
フィールドの説明
データ型
長さ
空き可能
拘束
デフォルト値
コメント
はい
ID
プライマリキー
NUMBER(18)
18
 
 
 
プライマリキー
 
NAME
名前
VARCHAR2(50)
50
はい
 
 
名前
 
ALIAS
別名#ベツメイ#
VARCHAR2(20)
20
はい
 
 
別名#ベツメイ#
 
REGULATION
ルール#ルール#
VARCHAR2(100)
100
はい
 
 
ルール#ルール#
 
GENEVERYDAY
毎日生成
SMALLINT
 
はい
 
 
毎日生成
 
NOLENGTH
ながれちょう
INTEGER
 
はい
 
 
ながれちょう
 
CURDATE
現在の日付
VARCHAR2(10)
10
はい
 
 
 
 
INITVALUE
初期値
INTEGER
 
はい
 
 
初期値
 
CURVALUE
現在の値
INTEGER
 
はい
 
 
現在の値
 
STEP
ステップ
SMALLINT
 
はい
 
 
ステップ
 
 
フロー番号の取得方法:
 
/**
	 *                  。
	 * @param alias		       。
	 * @return
	 */
	public synchronized  String  nextId(String alias){
                //         SELECT <include refid="columns"/> FROM SYS_IDENTITY	
                //WHERE alias=#{alias}  FOR UPDATE
		Identity identity=this.dao.getByAlias(alias);
		if(BeanUtils.isEmpty(identity)) return "";
		String rule=identity.getRule();
		int step=identity.getStep();
		int genEveryDay=identity.getGenEveryDay();
		//
		Integer curValue=identity.getCurValue();
		if(curValue==null) curValue=identity.getInitValue();
		//     
		if(genEveryDay==1){
			String curDate=getCurDate();
			String oldDate=identity.getCurDate();
			if(!curDate.equals(oldDate)){
				identity.setCurDate(curDate);
				curValue=identity.getInitValue();
			}
			else{
				curValue=curValue + step;
			}
		}
		else{
			curValue=curValue + step;
		}
		identity.setCurValue(curValue);
		dao.update(identity);
		//     。
		String rtn=getByRule(rule,identity.getNoLength(),curValue);
		
		return rtn;
	}