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

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

大约是几百人

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

23d7deb28352cf2d8b836ab4a89d045c.png

查看后台打印的sql为

b2ee627600ee58c1adb6b579be174002.png

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

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

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

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

1.HistoricVariableInstance

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

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

BEGIN

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})

;END ;

2.HistoricTaskInstanceEntity

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

修改代码如下

BEGIN

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})

;END ;

3.HistoricActivityInstanceEntity

执行后报错如下

发现是

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

HistoricActivityInstanceEntity这个对象,bulkInsertHistoricActivityInstance_oracle这个方法

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

BEGIN

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})

;END ;

4.ExecutionEntity

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

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

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

代码如下

BEGIN

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})

;END ;

5.TaskEntity

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

修改Task.xml中bulkInsertTask_oracle这个方法

代码如下

BEGIN

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})

;END ;

6.VariableInstanceEntity

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

修改VariableInstance.xml中的bulkInsertVariableInstance_oracle方法

代码如下

BEGIN

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})

;END ;

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值