SequenceGenerator注解的使用

   项目中有用hibernate 及@SequenceGenerator,建议加个allocationSize=1,因为项目启动的时候,hibernate会去读DB中相应的sequence值value,将value*50(默认allocationSize值)作为id的初始值,只要项目没重启,之后的id值是以增量1增加;

   如果系统重新启动之后,hibernate又会去重新计算一下id的初始值,比如此时DB中seq=1000,我们希望的是id初值为1000,如果未加allocationSize=1的话通过hibernate计算出来的id初值为1000*50=50000,数据量小的话情况不明显,数据量大且重启频繁的情况下,影响就很大了,一次重启可以引起Id蹭蹭蹭的变大。

   假设seq=1000-->id=50000,插入了1000条数据后seq=2000,id=51000,重启,seq=2000,id=100000,从51000-->100000

  插入10000条的话seq=11000,id=60000重启seq=11000,id=550000,从60000--》550000

  插入100000条的话seq=101000,id=150000重启seq=101000,id=5050000,从150000--》5050000

  id值变大,只是造成数据库中的id可能会缺少某一段比如从1000直接跳到50000,造成id溢出的可能性不大,例如bigint型的id,除非插入了184467440737095条数据才会造成溢出。

查了一下相关资料:

    http://docs.oracle.com/cd/E13189_01/kodo/docs40/full/html/ejb3_overview_mapping_sequence.html
这里写了一段为啥要设计kodo的 allocationSize,hibernater设计allocationSize的原因应该类似

postgresql是可以preallocated sequence,http://www.postgresql.org/docs/8.1/static/sql-createsequence.html

默认新建的序列缓存为1,也就是说如果要使用这个缓存特性的话,要改序列的cache值。

待研究问题:如果改序列的缓存值,有可能会造成两个并发进程获取到同样的seq段?

转载于:https://my.oschina.net/zjoschina/blog/179784

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值