服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

jbpm源码分析(一)---数据库表主键id的产生机制

        jbpm数据库中每一个表都有一个主键-idlong类型)。这个id是可以由用户自己产生,也可以由jbpm产生。这个数值在所有表的id中是唯一的。用户通过设定jbpm.id.generator属性来设定id产生的类。

    (一)jbpm id生成基本原理和函数

        jbpmid产生的基本原理是:用表jbpm_sequenceblock存储当前可用的id值,jbpm需要使用id时,从数据库中取得这个id,然后增加一定的数量作为当前可用id值,并存储在数据库中。jbpmid可以用于服务器集群的情况。hibernate中产生id的函数incrementgenerator,原理与jbpm产生id相似,但不能应用到集群的情况。

        jbpm_sequenceblock表有两个字段idnextid,前者为主键,表示当前节点在集群中的id号码,后者为当前节点可以使用数据段的最小数。表由类org.jbpm.persistence.hibernate.sequencebolck代表,org.jbpm.persistence.hibernate.sequencebolckidgenerator维护。

sequencebolckidgenerator主要函数:

        (1)   public sequenceblockidgenerator(jbpmconfiguration jbpmconfiguration)

初始化,包括初始化nodeid blocksize变量。nodeid指明当前的节点在集群中的id号(0-65535),用户可以通过jbpm.id.nodeid设定,缺省值是0blocksize指明当前节点使用长整形数段的一个数据块大小,用户可以通过jbpm.id.bolcksize设定,缺省值是100

        (2)  public long getnextid() //得到当前可用idjbpm使用它得到id

                {

                return getnextid(sessionfactory, nodeid, blocksize);

                  }

    (3public static synchronized long getnextid(sessionfactory sessionfactory,

                                            long nodeid, long blocksize)

    最重要的函数,用于计算当前可用id

    (二)id产生算法

    基本思路:将1long.maxvalue范围内数,按大小blocksize*maxnodes分段,然后再将每一段按blocksize大小分成maxnodes块,各节点按照节点号分块使用,如节点号为0的只能使用第一块,节点号为1的使用第二块,依次类推。maxnodes为当前集群中的节点总数,为65535

取值算法:

        (1)       取出节点当前可以使用数块的首数(块的最小数);

        (2)       首数+blocksize×nodeid(节点号码,065535)为当前可以使用的idnextid);

        (3)       nextid+blocksize-1为当前可以使用的最后一个idlastid

        (4)       调用getnextid()函数时,如果nextid<=lastid,则返回nextid,然后将nextid++;否则取出下一数据块进行13的计算。

    说明:

        (1)       读取一次数据库,可以使用blocksizeid,不用每次使用id都读取一次数据库。

        (2)       表的nextid字段存储的是当前可使用块而不是使用过块的首数。每个节点使用块的首数按节点号码分别存储。

        (3)       对于每一个数块,每个节点只使用其中一部分,范围是(首数+blocksize×nodeid)-(首数+blocksize×(nodeid1)-1),从而保证了每个节点使用的id值在数据库中是唯一的。

    (三)数据库连接session

    为了保证产生id的唯一性,jbpm要求对表jbpm_sequenceblock进行操作的数据库session必须是独立的,不能用于其它的数据库操作。如果jbpm使用数据库连接池,则必须要设定jbpm.id.generator.configuration属性,提供进行数据库直接连接的hibernate配置文件。默认情况下,jbpm使用一个全局静态session进行除jbpm_sequenceblock以外表的操作,而对jbpm_sequenceblock表进行操作的session是在类sequencebolckidgenerator初始化时临时建立的.

扫描关注微信公众号