JBPM的DBID自增长的实现

  随着系统的运行我的工作我起草查询出现了这样一个bug:工作列表中的当前步骤与历史中的当前环节并不符合。如下

 

  找到我起草这一块的sql,如下:

LEFT JOIN T_BPM_PROCESS_TASK task 
ON task.processExecutionId = Execution.id
AND task.taskId= ( select max(taskId) from T_BPM_PROCESS_TASK task2 where task2.processExecutionId = Execution.id)

 左连接task的activityName即为当前步骤。以上逻辑是基于taskId是按照某种规则向上增长的,先处理的环节的taskId肯定比后处理的taskId小,但通过这个例子,也已经发现taskId并不严格按照向上增长的规律变化。

找到创建新任务的入口(TaskServiceImpl)

commandService.execute(new NewTaskCmd(parentTaskId))

  这是一个命令模式,进入NewTaskCmd,进入execute()方法,再进入DBSessionImpl的createNewTask()方法,然后是createTask(),在这个方法里有的生成方法

long dbid = EnvironmentImpl.getFromCurrent(DbidGenerator.class).getNextId();

  上面是反射的应用,进到DbidGenerator的方法getNextId(),这是一个被同步的方法,每次只能有一个调用进入。我们再依次进入核心的方法acquireDbidBlock(),然后又是一个命令模式,AcquireDbidBlockCmd的execute,下面我们可以看到

PropertyImpl property = (PropertyImpl) session.createCriteria(PropertyImpl.class)
			      .add(Restrictions.eq("key", PropertyImpl.NEXT_DBID_KEY))
			      .uniqueResult();

  我们打开jbpm_property,里面有一条数据,指定的是id的生成方法以及步长。

  打开jbpm.task.hbm.xml可以看到

<id name="dbid" column="DBID_">
      <generator class="assigned" />
    </id>

  通过ibernate的generator属性的意义这篇文章,我们可以知道assigned的用法,即

assigned(程序设置)

让应用程序在save()之前为对象分配一个标示符,在save前通过自定义的id生成器生成了id。

大家都知道activiti5和jbpm5的区别和联系

Activiti5出自Tom之手,在DBID生成器的实现这块是一样的,下面是一篇对activiti5的ID自定义生成器的解释:

2、activiti5的默认主键策略分析:

(1)每次需要主键的时候从act_ge_property表中的next.dbid中获取下一个主键值,但是主键增长步长是100,也就是说每次从这里获取下一个值的时候,上次是100,下次的值是200.

(2)他们所有需要主键的表都从这个表中获取下一个值

(3)但是他们针对性能做了一个取巧处理,就是每次步长100,将这个步长cache在本地用sychronize方法调用,也就是说一段时间内只需要在本地获取主键即可,不需要访问数据实时更新,一定程度的缓解了数据库调用压力

(4)但是对于高并发来说,这个只能局部缓解,并发写入压力,还是有造成主键重复的概率

通过以上的解释,不难发现为什么jbpm4的DBID会出现小的情况,这与主键重复的原理是相似的。

通过以上分析,我们将我起草的查询逻辑改为:

AND task.createTime = ( select max(createTime) from T_BPM_PROCESS_TASK task2 where task2.processExecutionId = Execution.id limit 1)
时间: 2024-12-08 22:46:32

JBPM的DBID自增长的实现的相关文章

SQLServer数据库自增长标识列的更新修改操作

SQLServer数据库自增长标识列的更新修改操作方法在日常的sql server开发中,经常会用到Identity类型的标识列作为一个表结构的自增长编号.比如文章编号.记录序号等等.自增长的标识列的引用很大程度上方便了数据库程序的开发,但是有时这个固执的字段类型也会带来一些麻烦. 一.修改标识列字段的值:(在执行insert时,将ID手动的设置成想要的值)有时,为了实现某个功能,需要修改类型为Identity自增长类型的字段的值,但由于标识的类型所限,这种操作默认是不允许的.比如,目前数据库有

试读—增长黑客,创业公司必知的“黑科技”

概述 刚一看到书名,最引起注意的是黑客两个字,那个带着神秘色彩,让无数程序员羡慕嫉妒恨的角色.但仔细一看,增长黑客,创业公司必知的"黑科技",是讲公司如何以切实的依据.低廉的成本.可控的风险来达成用户增长.活跃度上升.收入额增加等知识及案例的,这对于初创公司又没有充足的资金去燃烧以改变用户习惯的情况无疑是雪中送炭.指北之针. 什么是增长黑客? 本书适合哪些读者? 增长 靠原始积累实现增长的时代已经过去,也不适合互联网.移动互联网.互联网+的模式.我们经常能看到类似的新闻"某公

Oracle简单使用之实现自增长

序列,触发器等相关的使用 微软下的Sqlserver实现增长只要设定列identity create table myTable( id int identity(1,1) primary key not null, name varchar(15) ); MySql下实现自增长只要设定列auto_increment create table myTable( id int auto_increment primary key not null, name varchar(15) ); Orac

mysql字段是自动增长类型结果却不是连续的

今天建了一张表,设置其"id"属性为自动增加类型,但是在查看所有数据的时候,却发现"id"的值不是连续增加的.建表的语法如下: mysql> create table person_list -> ( -> id int auto_increment unique, -> name varchar(15) not null, -> sex varchar(15) default "中", -> ID_C var

随着年龄增长,觉得更能理解这些事情

随着年龄增长,觉得更能理解这些事情 (2011-09-23 09:40:01) 转载▼ 及时.收到邮件24小时内回复. 近俗.长期阅读两种以上的财经期刊,知道最近什么是大奸大猾或者大痴大傻.长期阅读两种以上的专业期刊,知道最近什么最新潮. 学习.一年至少要读4本严肃书籍.严肃书籍的定义是,通常在机场是买不到的,不是近5年出的,不是你看了能不犯困的. 动笔.在当下,能想明白.写清楚的人越来越少,眼高手低的人越来越多.写作的过程,也是沉静.思考和凝练的过程. 强身.每天至少慢运动半小时,比如肢体伸展

如何增长U盘的寿命-&#160;小技巧

格式化时选择  exFAT格式,可以增长U盘的寿命 下边摘录自网上: exFAT(Extended File Allocation Table File System,扩展FAT,也称作fat64,即扩展文件分配表)是Microsoft在Windows Embeded 5.0以上(包括Windows CE 5.0.6.0.Windows Mobile5.6.6.1)中引入的一种适合于闪存的文件系统,为了解决FAT32等不支持4G及其更大的文件而推出.对于闪存,NTFS文件系统不适合使用,exFA

备忘:Hibernate id注解,自动增长

ID自动增长 @Id @GeneratedValue(strategy=GenerationType.IDENTITY) .

程序员也会营销——《增长黑客:创业公司的用户与收入增长秘籍》

就像<人人都是产品经理>这本书让所有人都用"产品经理"来称呼需求分析师这个岗位一样,<增长黑客>也让越来越多的人相信营销有个更有GEEK范的名字叫"增长黑客". 传统营销,整天像骆驼一样在烈日和暴雨下(看懂双关的传统营销流下了泪水)的街头拦住路人:"帅哥美女,下载APP送充电宝"或者在各大BBS刷"我曾是个diao丝,下载了APP才变成了高富帅"的软文,然而连5%的转化率都达不到. 然而广大营销朋友们的

JBPM工作流(八)——流程实例(PI)Process Instance

/** * 流程实例 *    *  启动流程实例 *    *  完成任务 *    *  查询 *      *  查询流程实例 *      *  查询任务 *          *  查询正在执行的任务 *            *  查询所有的正在执行的任务 *            *  根据任务的执行人查询正在执行的任务 *            *  根据executionId查询正在执行的任务 *            *  根据piid查询正在执行的任务 *