调用工具方法,一次返回单个主键,或多个主键。
要求,数据库sequence每次增加一个基数(100)。这样,只要访问一次数据库,就可以取得100个主键。不需要每条增加都访问sequence。
/**
* @author yangj
*
*/
public class DbidGenerator {
private static long currentSeqId = 0;
private static long currentId = 0;
private static long cache = 100;
/**
* 获取新的id值
* @return
*/
public static long getNextId() {
return getNextMultiId(1)[0];
}
/**
*
* @param count
* @return
*/
public static synchronized long[] getNextMultiId(int count){
if (currentSeqId==0L){//初始化
currentSeqId = getSequenceId();
currentId = currentSeqId;
}
if (count<=1){//个数<=1时,取一个值
long[] c1 = new long[1];
if (currentId-currentSeqId<cache){
currentId++;
}else{
currentSeqId = getSequenceId();
currentId = currentSeqId;
currentId++;
}
c1[0] = currentId;
return c1;
}else{
long[] c1 = new long[count];
for (int i = 0; i < count; i++) {
if (currentId-currentSeqId<cache){
currentId++;
}else{
currentSeqId = getSequenceId();
currentId = currentSeqId;
currentId++;
}
c1[i]=currentId;
}
return c1;
}
}
//获取sequence
private static long getSequenceId(){
//TODO 下列整个代码为测试用,要转成获取db2的sequence
if (currentSeqId==0L){
return 1L;
}else
return currentSeqId+100;
}
/**
* 创建DB2 sequence MSGID_SEQUENCE SQL:
create sequence id_sequence
as bigint
start with 10000000
increment by 100
minvalue 10000000
maxvalue 99999999
cycle
cache 20
order;
*/
/*public long getDB2NextSeqNo() throws Exception {
Object obj = getHibernateTemplate().execute(
new HibernateCallback() {
public Object doInHibernate(org.hibernate.Session session) throws org.hibernate.HibernateException,SQLException {
Query query = session.createSQLQuery("values nextval for id_sequence");
return query.list();
}
});
BigInteger next = (BigInteger)obj;
return next.longValue();
}*/
public static void main(String[] args){
for (int i=0;i<200;i++){
long l = getNextId();
System.err.println(l);
long[] id = getNextMultiId(2);
System.err.println(id[0]);
System.err.println(id[1]);
}
}
}