activiti5解决分布式集群部署的主键问题

1、概要综述 html

一、activiti5是jbpm4升级上来的一款最新版工做流引擎,已经将本身的表划分为4类:运行时、通用数据、历史数据、流程相关数据,可是 有一个核心问题就是是否支持集群部署,通过我对源码的初步分析发现,他的默认主键策略是全局获取一个通用表中的字段来作增长,在大并发量的状况下会出现主 键重复的问题 java

二、activiti5的默认主键策略分析: 算法

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

(2)、他们全部须要主键的表都从这个表中获取下一个值 数据库

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

(4)、可是对于高并发来讲,这个只能局部缓解,并发写入压力,仍是有形成主键重复的几率 并发

三、解决方案分析 app

(1)、由于activiti的主键是统一管理,直接经过集中替换主键策略就能够完成主键策略的替换 高并发

(2)、通过分析源码发现activiti的流程引擎的主键引用采用的方式是先看spring配置的 idGenerator 属性是否有外部注入,若是没有,才使用默认的主键策略生成主键,因此咱们只须要针对配置文件进行主键策略的替换便可 性能

(3)、寻找一种能产生惟一主键的生成策略,这里uuid多是一个比较通用的解决方案,不过悲剧的是uuid对于人去识别可能不是很友好,可是对于程序来讲无所谓了,而activiti自己的id字段也支持uuid算法来生成主键。


2、实施方案

为了快速见效,直接用activiti官方提供的activiti-explorer项目来更换主键策略来验证效果

一、直接找到部署的war包,更新它的配置文件,来指定主键策略。这里咱们要找的就是那个applicationContext.xml文件

<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfigurat
ion">
  	<property name="dataSource" ref="dataSource" />
  	<property name="transactionManager" ref="transactionManager" />
  	<property name="databaseSchemaUpdate" value="true" />
  	<property name="jobExecutorActivate" value="true" />
    <property name="customFormTypes">
      <list>
        <ref bean="userFormType"/>
      </list>
    </property>  <property name="idGenerator"><bean class="org.activiti.engine.impl.persiste
nce.StrongUuidGenerator" /></property> </bean>

二、将主键策略要引用的uuid这个jar包引入,这里我使用java-uuid-generator-3.1.2.jar

 

三、从新启动tomcat来作相关流程部署,发现数据库中的主键策略真的变为uuid了(这里别忘记先清理库啊,这样看起来效果才不会被干扰,由于之前一直用的是默认主键生成策略,生成的int类型的主键)

相关文章
相关标签/搜索