Activiti+Oracle,在数据量大的时候报错:无法支持1000列以上

因为业务需要,我这里可能需要非常多的人进行会签任务操作

大约是几百人

然后Activiti在存流程变量的时候,系统报错如下图所示

查看后台打印的sql为

 

看来Oracle不支持,1000列以上的sql。应该可以通过数据库的设置,来进行修改。

有一个数据库,执行同样的业务,并不会报错,估计是数据库可以设置,但是没调好。。。。

 

只能研究了一下,去修改下源码吧

总结了之后,需要修改的地方多,但是不难,很简单,因为Activiti需要操作很多张表,都是相同的问题。总结如下

1.HistoricVariableInstance

源码包里找到这个映射文件   HistoricVariableInstance.xml

找到插入流程变量的时候,的代码,修改如下

  <insert id="bulkInsertHistoricVariableInstance_oracle" parameterType="java.util.List">
	   BEGIN
		<foreach collection="list" item="historicVariable" index="index" separator=";" >
		   INSERT INTO ${prefix}ACT_HI_VARINST (ID_, PROC_INST_ID_, EXECUTION_ID_, TASK_ID_, NAME_, REV_,
			VAR_TYPE_, BYTEARRAY_ID_, DOUBLE_, LONG_ , TEXT_, TEXT2_, CREATE_TIME_, LAST_UPDATED_TIME_) VALUES
			(#{historicVariable.id, jdbcType=VARCHAR},
			   #{historicVariable.processInstanceId, jdbcType=VARCHAR},
			   #{historicVariable.executionId, jdbcType=VARCHAR},
			   #{historicVariable.taskId, jdbcType=VARCHAR},
			   #{historicVariable.variableName, jdbcType=VARCHAR},
			   #{historicVariable.revision, jdbcType=VARCHAR},
			   #{historicVariable.variableType, jdbcType=VARCHAR},
			   #{historicVariable.byteArrayRef, typeHandler=ByteArrayRefTypeHandler},
			   #{historicVariable.doubleValue, jdbcType=DOUBLE},
			   #{historicVariable.longValue, jdbcType=BIGINT},
			   #{historicVariable.textValue, jdbcType=VARCHAR},
			   #{historicVariable.textValue2, jdbcType=VARCHAR},
			   #{historicVariable.createTime, jdbcType=TIMESTAMP},
			   #{historicVariable.lastUpdatedTime, jdbcType=TIMESTAMP})
		</foreach>
		;END ;
  </insert>

 

2.HistoricTaskInstanceEntity

 

发现是HistoricTaskInstanceEntity这个对象的这个方法bulkInsertHistoricTaskInstance_oracle

修改代码如下

<insert id="bulkInsertHistoricTaskInstance_oracle" parameterType="java.util.List">
      BEGIN
        <foreach collection="list" item="historicTask" index="index" separator=";">
          INSERT INTO ${prefix}ACT_HI_TASKINST (
            ID_,
            PROC_DEF_ID_,
            PROC_INST_ID_,
            EXECUTION_ID_,
            NAME_,
            PARENT_TASK_ID_,
            DESCRIPTION_,
            OWNER_,
            ASSIGNEE_,
            START_TIME_,
            CLAIM_TIME_,
            END_TIME_,
            DURATION_,
            DELETE_REASON_,
            TASK_DEF_KEY_,
            FORM_KEY_,
            PRIORITY_,
            DUE_DATE_,
            CATEGORY_,
            TENANT_ID_
          ) VALUES 
            (#{historicTask.id ,jdbcType=VARCHAR},
             #{historicTask.processDefinitionId, jdbcType=VARCHAR},
             #{historicTask.processInstanceId, jdbcType=VARCHAR},
             #{historicTask.executionId, jdbcType=VARCHAR},
             #{historicTask.name ,jdbcType=VARCHAR},
             #{historicTask.parentTaskId ,jdbcType=VARCHAR},
             #{historicTask.description ,jdbcType=VARCHAR},
             #{historicTask.owner ,jdbcType=VARCHAR},
             #{historicTask.assignee ,jdbcType=VARCHAR},
             #{historicTask.startTime, jdbcType=TIMESTAMP},
             #{historicTask.claimTime, jdbcType=TIMESTAMP},
             #{historicTask.endTime, jdbcType=TIMESTAMP},
             #{historicTask.durationInMillis ,jdbcType=BIGINT},
             #{historicTask.deleteReason ,jdbcType=VARCHAR},
             #{historicTask.taskDefinitionKey ,jdbcType=VARCHAR},
             #{historicTask.formKey ,jdbcType=VARCHAR},
             #{historicTask.priority, jdbcType=INTEGER},
             #{historicTask.dueDate, jdbcType=TIMESTAMP},
             #{historicTask.category, jdbcType=VARCHAR},
             #{historicTask.tenantId, jdbcType=VARCHAR})
        </foreach>
    ;END ;
  </insert>

 

3.HistoricActivityInstanceEntity

 

执行后报错如下

发现是

org.activiti.engine.impl.persistence.entity.HistoricActivityInstanceEntity.bulkInsertHistoricActivityInstance_oracle-Inline

 

HistoricActivityInstanceEntity这个对象,bulkInsertHistoricActivityInstance_oracle这个方法

修改HistoricActivityInstance.xml文件中的bulkInsertHistoricActivityInstance_oracle这个方法,修改代码如下

  <insert id="bulkInsertHistoricActivityInstance_oracle" parameterType="java.util.List">
      BEGIN
      <foreach collection="list" item="historicActivityInstance" index="index" separator=";">
        INSERT INTO ${prefix}ACT_HI_ACTINST (
          ID_,
          PROC_DEF_ID_,
          PROC_INST_ID_,
          EXECUTION_ID_,
          ACT_ID_,
          TASK_ID_,
          CALL_PROC_INST_ID_,
          ACT_NAME_,
          ACT_TYPE_,
          ASSIGNEE_,
          START_TIME_,
          END_TIME_,
          DURATION_,
          TENANT_ID_
        ) VALUES 
           (#{historicActivityInstance.id ,jdbcType=VARCHAR},
            #{historicActivityInstance.processDefinitionId, jdbcType=VARCHAR},
            #{historicActivityInstance.processInstanceId, jdbcType=VARCHAR},
            #{historicActivityInstance.executionId, jdbcType=VARCHAR},
            #{historicActivityInstance.activityId ,jdbcType=VARCHAR},
            #{historicActivityInstance.taskId ,jdbcType=VARCHAR},
            #{historicActivityInstance.calledProcessInstanceId ,jdbcType=VARCHAR},
            #{historicActivityInstance.activityName ,jdbcType=VARCHAR},
            #{historicActivityInstance.activityType ,jdbcType=VARCHAR},
            #{historicActivityInstance.assignee ,jdbcType=VARCHAR},
            #{historicActivityInstance.startTime, jdbcType=TIMESTAMP},
            #{historicActivityInstance.endTime, jdbcType=TIMESTAMP},
            #{historicActivityInstance.durationInMillis ,jdbcType=BIGINT},
            #{historicActivityInstance.tenantId, jdbcType=VARCHAR})
      </foreach>
     ;END ;
  </insert>

 

4.ExecutionEntity

 

不出意外,又报错了,这次是这个

org.activiti.engine.impl.persistence.entity.ExecutionEntity.bulkInsertExecution_oracle

修改Execution.xml这个文件中的bulkInsertExecution_oracle这个方法

代码如下

  <insert id="bulkInsertExecution_oracle" parameterType="java.util.List">
    BEGIN
      <foreach collection="list" item="execution" index="index" separator=";">
        INSERT INTO ${prefix}ACT_RU_EXECUTION (ID_, REV_, PROC_INST_ID_, BUSINESS_KEY_, PROC_DEF_ID_, ACT_ID_,
        IS_ACTIVE_, IS_CONCURRENT_, IS_SCOPE_,IS_EVENT_SCOPE_, PARENT_ID_, SUPER_EXEC_, SUSPENSION_STATE_, CACHED_ENT_STATE_, TENANT_ID_, NAME_) VALUES 
            (#{execution.id ,jdbcType=VARCHAR},
             1,
             #{execution.processInstanceId, jdbcType=VARCHAR},
             #{execution.businessKey, jdbcType=VARCHAR},
             #{execution.processDefinitionId ,jdbcType=VARCHAR},
             #{execution.activityId ,jdbcType=VARCHAR},
             #{execution.isActive ,jdbcType=BOOLEAN},
             #{execution.isConcurrent ,jdbcType=BOOLEAN},
             #{execution.isScope ,jdbcType=BOOLEAN},
             #{execution.isEventScope ,jdbcType=BOOLEAN},
             #{execution.parentId, jdbcType=VARCHAR},
             #{execution.superExecutionId, jdbcType=VARCHAR},
             #{execution.suspensionState, jdbcType=INTEGER},
             #{execution.cachedEntityState, jdbcType=INTEGER},
             #{execution.tenantId, jdbcType=VARCHAR},
             #{execution.name, jdbcType=VARCHAR})
      </foreach>
    ;END ;
  </insert>

 

5.TaskEntity

 

org.activiti.engine.impl.persistence.entity.TaskEntity.bulkInsertTask_oracle

修改Task.xml中bulkInsertTask_oracle这个方法

代码如下

<insert id="bulkInsertTask_oracle" parameterType="java.util.List">
    BEGIN
      <foreach collection="list" item="task" index="index" separator=";">
        INSERT INTO ${prefix}ACT_RU_TASK (ID_, REV_, NAME_, PARENT_TASK_ID_, DESCRIPTION_, PRIORITY_, CREATE_TIME_, OWNER_,
             ASSIGNEE_, DELEGATION_, EXECUTION_ID_, PROC_INST_ID_, PROC_DEF_ID_, TASK_DEF_KEY_, DUE_DATE_, CATEGORY_,
             SUSPENSION_STATE_, TENANT_ID_, FORM_KEY_) VALUES 
        (#{task.id, jdbcType=VARCHAR},
         1,
         #{task.name, jdbcType=VARCHAR},
         #{task.parentTaskId, jdbcType=VARCHAR},
         #{task.description, jdbcType=VARCHAR},
         #{task.priority, jdbcType=INTEGER},
         #{task.createTime, jdbcType=TIMESTAMP},
         #{task.owner, jdbcType=VARCHAR},
         #{task.assignee, jdbcType=VARCHAR},
         #{task.delegationStateString, jdbcType=VARCHAR},
         #{task.executionId, jdbcType=VARCHAR},
         #{task.processInstanceId, jdbcType=VARCHAR},
         #{task.processDefinitionId, jdbcType=VARCHAR},
         #{task.taskDefinitionKey, jdbcType=VARCHAR},
         #{task.dueDate, jdbcType=TIMESTAMP},
         #{task.category, jdbcType=VARCHAR},
         #{task.suspensionState, jdbcType=INTEGER},
         #{task.tenantId, jdbcType=VARCHAR},
         #{task.formKey, jdbcType=VARCHAR})
    </foreach>
    ;END ;
  </insert>

 

6.VariableInstanceEntity

 

org.activiti.engine.impl.persistence.entity.VariableInstanceEntity.bulkInsertVariableInstance_oracle

修改VariableInstance.xml中的bulkInsertVariableInstance_oracle方法

代码如下

  <insert id="bulkInsertVariableInstance_oracle" parameterType="java.util.List">
    BEGIN
      <foreach collection="list" item="variable" index="index" separator=";">
         INSERT INTO ${prefix}ACT_RU_VARIABLE (ID_, REV_,
          TYPE_, NAME_, PROC_INST_ID_, EXECUTION_ID_, TASK_ID_, BYTEARRAY_ID_,
          DOUBLE_, LONG_ , TEXT_, TEXT2_) VALUES 
         (#{variable.id, jdbcType=VARCHAR},
          1,
          #{variable.typeName, jdbcType=VARCHAR },
          #{variable.name, jdbcType=VARCHAR},
          #{variable.processInstanceId, jdbcType=VARCHAR},
          #{variable.executionId, jdbcType=VARCHAR},
          #{variable.taskId, jdbcType=VARCHAR},
          #{variable.byteArrayRef, typeHandler=ByteArrayRefTypeHandler},
          #{variable.doubleValue, jdbcType=DOUBLE},
          #{variable.longValue, jdbcType=BIGINT},
          #{variable.textValue, jdbcType=VARCHAR},
          #{variable.textValue2, jdbcType=VARCHAR}) 
      </foreach>
    ;END ;
  </insert>

 

执行成功,以上六个对象,对应六张表,也可以看出Activiti启动的时候,会操作这六张表

 

 

转载于:https://my.oschina.net/glorylion/blog/896585

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值