批量获取主键sequence的主键

来源:互联网 发布:怎么在淘宝买岛国资源 编辑:程序博客网 时间:2024/06/09 18:21

调用工具方法,一次返回单个主键,或多个主键。

要求,数据库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]);
  }  
 }

}