seqhilo算法如何在Hibernate和Postgresql中处理序列

seqhilo算法如何在Hibernate和Postgresql中处理序列,hibernate,Hibernate,在Hibernate with Postgresql中,seqhilo算法如何处理sequence <id name="id" column="attid" type="long" unsaved-value="-1"> <generator class="seqhilo"> <param name="max_lo">1</param> <param na

在Hibernate with Postgresql中,
seqhilo
算法如何处理
sequence

    <id name="id" column="attid" type="long"
        unsaved-value="-1">
        <generator class="seqhilo">
            <param name="max_lo">1</param>
            <param name="sequence">
                att_seq
            </param>
        </generator>
    </id>

1.
附件

如果我使用这个配置,假设当前值
att_seq
为1000,那么Hibernate生成的值是多少?这是如何工作的?

步骤1:在应用程序启动时,hibernate将其内部管理的lo变量初始化为max_lo+1。所以lo变成=2

步骤2:要生成下一个值,它使用以下代码:

    if (maxLo < 1) {

      long val = ( (Number) super.generate(session, obj) ).longValue();

      if (val == 0) val = ( (Number) super.generate(session, obj) ).longValue();

        return IdentifierGeneratorFactory.createNumber( val, returnClass );

      }

   if ( lo>maxLo ) {

     long hival = ( (Number) super.generate(session, obj) ).longValue();

     lo = (hival == 0) ? 1 : 0;

     hi = hival * ( maxLo+1 );

     if ( log.isDebugEnabled() )

      log.debug("new hi value: " + hival);

     }

   return IdentifierGeneratorFactory.createNumber( hi + lo++, returnClass );
if(maxLo<1){
long val=((Number)super.generate(session,obj)).longValue();
if(val==0)val=((Number)super.generate(session,obj)).longValue();
返回标识GeneratorFactory.createNumber(val,返回类);
}
如果(lo>maxLo){
long hival=((Number)super.generate(session,obj)).longValue();
lo=(hival==0)?1:0;
hi=hival*(最大值+1);
if(log.isDebugEnabled())
log.debug(“新的hi值:+hival”);
}
返回标识GeneratorFactory.createNumber(hi+lo++,返回类);
总结:它第一次命中序列并获得值。将其乘以(max_lo+1)并给出唯一id。 下次它不会命中数据库并在内部将最后一个值增加1

之后,再次重复上述循环

因此,在某种程度上,每请求两个唯一ID,它就会访问数据库一次