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初始化时临时建立的。.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值