项目中有用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段?