dram.me

OFBiz中的ID自增机制

由于考虑多数据库的支持,OFBiz在ID自增处理上,没有依赖数据库特性,而是程序逻辑实现。

数据库中有一个表用于存放ID序列信息:sequence_value_item,在getNextSeqIdLong中有涉及对该表的操作,相关代码还包括getNextSeqIdsetNextSubSeqIdmake-next-seq-id

EntityAutoEngine中的invokeCreate中也有涉及相关操作。

大概的逻辑(部分猜测):

sequence_value_item存放的是大的序列块,因为涉及到性能问题,所以又引入了SequenceBank作为缓存。需要新ID时,先从bank取,如果bank中已经空了,bank从sequence_value_item申请一块新的。

按照这样的分析,在导出数据的时候,只需要再导出sequence_value_item表即可。

序列号中间可能中断,也是因为bank作为内存中的缓存,如果服务强制退出,这部分缓存的序列号就会丢失,下次重新启动时,又是从sequence_value_item获取新的起始值。