seqhilo算法如何在Hibernate和Postgresql中处理序列
在Hibernate with 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
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,它就会访问数据库一次