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

前端之家收集整理的这篇文章主要介绍了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,#{historicVariable.executionId,#{historicVariable.taskId,#{historicVariable.variableName,#{historicVariable.revision,#{historicVariable.variableType,#{historicVariable.byteArrayRef,typeHandler=ByteArrayRefTypeHandler},#{historicVariable.doubleValue,jdbcType=DOUBLE},#{historicVariable.longValue,jdbcType=BIGINT},#{historicVariable.textValue,#{historicVariable.textValue2,#{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_,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,#{historicTask.processDefinitionId,#{historicTask.processInstanceId,#{historicTask.executionId,#{historicTask.name,#{historicTask.parentTaskId,#{historicTask.description,#{historicTask.owner,#{historicTask.assignee,#{historicTask.startTime,#{historicTask.claimTime,#{historicTask.endTime,#{historicTask.durationInMillis,#{historicTask.deleteReason,#{historicTask.taskDefinitionKey,#{historicTask.formKey,#{historicTask.priority,jdbcType=INTEGER},#{historicTask.dueDate,#{historicTask.category,#{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_,ACT_ID_,CALL_PROC_INST_ID_,ACT_NAME_,ACT_TYPE_,TENANT_ID_
        ) VALUES 
           (#{historicActivityInstance.id,#{historicActivityInstance.processDefinitionId,#{historicActivityInstance.processInstanceId,#{historicActivityInstance.executionId,#{historicActivityInstance.activityId,#{historicActivityInstance.taskId,#{historicActivityInstance.calledProcessInstanceId,#{historicActivityInstance.activityName,#{historicActivityInstance.activityType,#{historicActivityInstance.assignee,#{historicActivityInstance.startTime,#{historicActivityInstance.endTime,#{historicActivityInstance.durationInMillis,#{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_,BUSINESS_KEY_,IS_ACTIVE_,IS_CONCURRENT_,IS_SCOPE_,IS_EVENT_SCOPE_,PARENT_ID_,SUPER_EXEC_,SUSPENSION_STATE_,CACHED_ENT_STATE_,TENANT_ID_,NAME_) VALUES 
            (#{execution.id,1,#{execution.processInstanceId,#{execution.businessKey,#{execution.processDefinitionId,#{execution.activityId,#{execution.isActive,jdbcType=BOOLEAN},#{execution.isConcurrent,#{execution.isScope,#{execution.isEventScope,#{execution.parentId,#{execution.superExecutionId,#{execution.suspensionState,#{execution.cachedEntityState,#{execution.tenantId,#{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_,DELEGATION_,FORM_KEY_) VALUES 
        (#{task.id,#{task.name,#{task.parentTaskId,#{task.description,#{task.priority,#{task.createTime,#{task.owner,#{task.assignee,#{task.delegationStateString,#{task.executionId,#{task.processInstanceId,#{task.processDefinitionId,#{task.taskDefinitionKey,#{task.dueDate,#{task.category,#{task.suspensionState,#{task.tenantId,#{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_,TYPE_,TEXT2_) VALUES 
         (#{variable.id,#{variable.typeName,jdbcType=VARCHAR },#{variable.name,#{variable.processInstanceId,#{variable.executionId,#{variable.taskId,#{variable.byteArrayRef,#{variable.doubleValue,#{variable.longValue,#{variable.textValue,#{variable.textValue2,jdbcType=VARCHAR}) 
      </foreach>
    ;END ;
  </insert>

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

猜你在找的Oracle相关文章