欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

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

发布时间:2025/5/22 编程问答 32 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Activiti+Oracle,在数据量大的时候报错:无法支持1000列以上 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

2019独角兽企业重金招聘Python工程师标准>>>

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

大约是几百人

然后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

总结

以上是生活随笔为你收集整理的Activiti+Oracle,在数据量大的时候报错:无法支持1000列以上的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。