工作流性能优化(敢问activiti有扩展性?)(2)

2015/4/17

粗略看了activiti的sql的,在ativity engine包里边;

没什么头绪,先用excel记录数据量少的时候本机的性能情况;

 

不打印hibernate的sql;一刷一大片,还不输出参数是什么,这样的语句有什么意义哦,怀念mybatis;

<property name="showSql" value="false" />

 

让程序充分加载,取第三次的结果:

开始时间:2015-04-17 09:38:20.611

总记录数:57

结束时间:2015-04-17 09:38:22.788

总耗时:2177毫秒。

开始时间:2015-04-17 09:39:24.174

总记录数:57

结束时间:2015-04-17 09:39:26.110

总耗时:1936毫秒。

开始时间:2015-04-17 09:39:30.521

总记录数:57

结束时间:2015-04-17 09:39:32.331

总耗时:1810毫秒。

 

设置打印activiti中mybatis的sql;

<logger name="org.apache.ibatis.jdbc.ScriptRunner" level="DEBUG"/>

<!-- 目前本人只知道这句最有用 -->

<logger name="org.activiti.engine.impl.persistence.entity" level="DEBUG"/>

<!-- 下面是其他帖子抄的不知道有什么用 -->

<logger name="java.sql.Connection" level="DEBUG"/>

<logger name="java.sql.Statement" level="DEBUG"/>

<logger name="java.sql.PreparedStatement" level="DEBUG"/>

<logger name="java.sql.ResultSet" level="DEBUG"/>

 

配置logback;

slf4j包冲突的,在pom.xml里边指定slf4j的版本就可以;

 

数据语句:

2015-04-17 10:25:30.487 DEBUG org.activiti.engine.impl.persistence.entity.HistoricProcessInstanceEntity.selectHistoricProcessInstancesByQueryCriteria - ooo Using Connection [Transaction-aware proxy for target Connection from DataSource [[email protected]b17]]

2015-04-17 10:25:30.487 DEBUG org.activiti.engine.impl.persistence.entity.HistoricProcessInstanceEntity.selectHistoricProcessInstancesByQueryCriteria - ==> Preparing: select RES.* from ACT_HI_PROCINST RES WHERE ( exists(select LINK.USER_ID_ from ACT_HI_IDENTITYLINK LINK where USER_ID_ = ? and LINK.PROC_INST_ID_ = RES.ID_) ) order by RES.START_TIME_ desc LIMIT ? OFFSET ?

2015-04-17 10:25:30.488 DEBUG org.activiti.engine.impl.persistence.entity.HistoricProcessInstanceEntity.selectHistoricProcessInstancesByQueryCriteria - ==> Parameters: 324(String), 2147483647(Integer), 0(Integer)

爱死mybatis,要啥有啥;

 

这里感觉没分页啊;

找出涉及哪些表,然后手工拼接数据,成功插入了1条数据;

写程序插入数据;

NM,activiti新增条记录都n麻烦,能不能好好编程了;

 

换mysql存储过程,不错哦;

delimiter $$

use `keyan2`$$

drop procedure if exists `insert_task`$$

create definer=`root`@`localhost` procedure `insert_task`()

begin

declare beginId int default 100000;

declare detailId int default 100000;

declare actinstId int default 100000;

declare actinstId_org int default 100000;

declare varinstId int default 100000;

declare PROC_DEF_ID_ varchar(255) default ‘process_38869:8:87533‘;

declare ACT_ID_ varchar(255) default ‘sid-6EFEBB5D-1A5A-4737-TEST-A255D5‘;

declare TASK_DEF_KEY_ varchar(255) default ‘sid-6EFEBB5D-1A5A-4737-TEST-A255D8‘;

declare num int default 0;

while num < 1000 do

insert into `keyan2`.`act_ru_execution` (`ID_`, `REV_`, `PROC_INST_ID_`, `PROC_DEF_ID_`, `ACT_ID_`, `IS_ACTIVE_`, `IS_CONCURRENT_`, `IS_SCOPE_`, `IS_EVENT_SCOPE_`, `SUSPENSION_STATE_`,

`CACHED_ENT_STATE_`) values (beginId, ‘1‘, beginId, PROC_DEF_ID_, concat(ACT_ID_, beginId), ‘1‘, ‘0‘, ‘1‘, ‘0‘, ‘1‘, ‘2‘);

insert into `keyan2`.`act_ru_task` (`ID_`, `REV_`, `EXECUTION_ID_`, `PROC_INST_ID_`, `PROC_DEF_ID_`, `NAME_`, `TASK_DEF_KEY_`, `ASSIGNEE_`, `PRIORITY_`, `CREATE_TIME_`, `SUSPENSION_STATE_`)

values (beginId, ‘1‘, beginId, beginId, PROC_DEF_ID_, ‘编制‘, concat(TASK_DEF_KEY_, beginId), ‘324‘, ‘50‘, now(), ‘1‘);

insert into `keyan2`.`act_hi_taskinst` (`ID_`, `PROC_DEF_ID_`, `TASK_DEF_KEY_`, `PROC_INST_ID_`, `EXECUTION_ID_`, `NAME_`, `ASSIGNEE_`, `START_TIME_`, `PRIORITY_`)

values (beginId, PROC_DEF_ID_, concat(TASK_DEF_KEY_, beginId), beginId, beginId, ‘编制‘, ‘324‘, now(), ‘50‘);

insert into `keyan2`.`act_hi_procinst` (`ID_`, `PROC_INST_ID_`, `PROC_DEF_ID_`, `START_TIME_`, `START_USER_ID_`, `START_ACT_ID_`)

values (beginId, beginId, PROC_DEF_ID_, now(), ‘324‘, concat(ACT_ID_, beginId));

insert into `keyan2`.`act_hi_detail` (`ID_`, `TYPE_`, `PROC_INST_ID_`, `EXECUTION_ID_`, `NAME_`, `VAR_TYPE_`, `REV_`, `TIME_`, `TEXT_`)

values (detailId, ‘VariableUpdate‘, beginId, beginId, ‘user0‘, ‘string‘, ‘0‘, now(),‘324‘);

set detailId=detailId+1;

insert into `keyan2`.`act_hi_detail` (`ID_`, `TYPE_`, `PROC_INST_ID_`, `EXECUTION_ID_`, `NAME_`, `VAR_TYPE_`, `REV_`, `TIME_`, `TEXT_`,`ACT_INST_ID_`)

values (detailId, ‘VariableUpdate‘, beginId, beginId, ‘$category$‘, ‘string‘, ‘0‘, now(),‘information‘, actinstId);

set detailId=detailId+1;

insert into `keyan2`.`act_hi_detail` (`ID_`, `TYPE_`, `PROC_INST_ID_`, `EXECUTION_ID_`, `NAME_`, `VAR_TYPE_`, `REV_`, `TIME_`, `TEXT_`,`ACT_INST_ID_`)

values (detailId, ‘VariableUpdate‘, beginId, beginId, ‘$processDefinitionKey$‘, ‘string‘, ‘0‘, now(),‘process_38869‘, actinstId);

set detailId=detailId+1;

insert into `keyan2`.`act_hi_detail` (`ID_`, `TYPE_`, `PROC_INST_ID_`, `EXECUTION_ID_`, `NAME_`, `VAR_TYPE_`, `REV_`, `TIME_`, `TEXT_`,`ACT_INST_ID_`, `LONG_`)

values (detailId, ‘VariableUpdate‘, beginId, beginId, ‘$startUser$‘, ‘long‘, ‘0‘, now(),‘324‘, actinstId, ‘324‘);

set detailId=detailId+1;

insert into `keyan2`.`act_hi_detail` (`ID_`, `TYPE_`, `PROC_INST_ID_`, `EXECUTION_ID_`, `NAME_`, `VAR_TYPE_`, `REV_`, `TIME_`, `TEXT_`,`ACT_INST_ID_`)

values (detailId, ‘VariableUpdate‘, beginId, beginId, ‘$title$‘, ‘string‘, ‘0‘, now(), concat(‘TEST‘, beginId), actinstId);

set detailId=detailId+1;

insert into `keyan2`.`act_hi_detail` (`ID_`, `TYPE_`, `PROC_INST_ID_`, `EXECUTION_ID_`, `NAME_`, `VAR_TYPE_`, `REV_`, `TIME_`, `ACT_INST_ID_`, `BYTEARRAY_ID_`)

values (detailId, ‘VariableUpdate‘, beginId, beginId, ‘$start#91462.formDefinition$‘, ‘serializable‘, ‘0‘, now(), actinstId, ‘91480‘);

set detailId=detailId+1;

insert into `keyan2`.`act_hi_detail` (`ID_`, `TYPE_`, `PROC_INST_ID_`, `EXECUTION_ID_`, `NAME_`, `VAR_TYPE_`, `REV_`, `TIME_`, `ACT_INST_ID_`, `BYTEARRAY_ID_`)

values (detailId, ‘VariableUpdate‘, beginId, beginId, ‘$projectNode$‘, ‘bytes‘, ‘0‘, now(), actinstId, ‘91485‘);

set actinstId_org = actinstId;

insert into `keyan2`.`act_hi_actinst` (`ID_`, `PROC_DEF_ID_`, `PROC_INST_ID_`, `EXECUTION_ID_`, `ACT_ID_`, `ACT_NAME_`, `ACT_TYPE_`, `START_TIME_`, `END_TIME_`, `DURATION_`)

values (actinstId, PROC_DEF_ID_, beginId, beginId, concat(‘sid-6EFEBB5D-1A5A-4737-TEST-A255D8‘, actinstId), ‘开始‘, ‘startEvent‘, now(), now(), ‘0‘);

set actinstId = actinstId+1;

insert into `keyan2`.`act_hi_actinst` (`ID_`, `PROC_DEF_ID_`, `PROC_INST_ID_`, `EXECUTION_ID_`, `ACT_ID_`, `TASK_ID_`, `ACT_NAME_`, `ACT_TYPE_`, `ASSIGNEE_`, `START_TIME_`)

values (actinstId, PROC_DEF_ID_, beginId, beginId, concat(‘sid-6EFEBB5D-1A5A-4737-TEST-A255D8‘, actinstId), actinstId_org, ‘编制‘, ‘userTask‘, ‘324‘, now());

insert into `keyan2`.`act_hi_identitylink` (`ID_`, `TYPE_`, `USER_ID_`, `PROC_INST_ID_`) values (beginId, ‘starter‘, ‘324‘, beginId);

insert into `keyan2`.`act_hi_varinst` (`ID_`, `PROC_INST_ID_`, `EXECUTION_ID_`, `NAME_`, `VAR_TYPE_`, `REV_`, `TEXT_`)

values (varinstId, beginId, beginId, ‘user0‘, ‘string‘, ‘0‘, ‘324‘);

set varinstId = varinstId + 1;

insert into `keyan2`.`act_hi_varinst` (`ID_`, `PROC_INST_ID_`, `EXECUTION_ID_`, `NAME_`, `VAR_TYPE_`, `REV_`, `TEXT_`)

values (varinstId, beginId, beginId, ‘$category$‘, ‘string‘, ‘0‘, ‘information‘);

set varinstId = varinstId + 1;

insert into `keyan2`.`act_hi_varinst` (`ID_`, `PROC_INST_ID_`, `EXECUTION_ID_`, `NAME_`, `VAR_TYPE_`, `REV_`, `TEXT_`)

values (varinstId, beginId, beginId, ‘$processDefinitionKey$‘, ‘string‘, ‘0‘, ‘process_38869‘);

set varinstId = varinstId + 1;

insert into `keyan2`.`act_hi_varinst` (`ID_`, `PROC_INST_ID_`, `EXECUTION_ID_`, `NAME_`, `VAR_TYPE_`, `REV_`, `TEXT_`, `LONG_`)

values (varinstId, beginId, beginId, ‘$startUser$‘, ‘long‘, ‘0‘, ‘324‘, ‘324‘);

set varinstId = varinstId + 1;

insert into `keyan2`.`act_hi_varinst` (`ID_`, `PROC_INST_ID_`, `EXECUTION_ID_`, `NAME_`, `VAR_TYPE_`, `REV_`, `TEXT_`)

values (varinstId, beginId, beginId, ‘$title$‘, ‘string‘, ‘0‘, concat(‘TEST‘, beginId));

set varinstId = varinstId + 1;

insert into `keyan2`.`act_hi_varinst` (`ID_`, `PROC_INST_ID_`, `EXECUTION_ID_`, `NAME_`, `VAR_TYPE_`, `REV_`, `BYTEARRAY_ID_`)

values (varinstId, beginId, beginId, ‘$start#91462.formDefinition$‘, ‘serializable‘, ‘0‘, ‘91479‘);

set varinstId = varinstId + 1;

insert into `keyan2`.`act_hi_varinst` (`ID_`, `PROC_INST_ID_`, `EXECUTION_ID_`, `NAME_`, `VAR_TYPE_`, `REV_`, `BYTEARRAY_ID_`)

values (varinstId, beginId, beginId, ‘$projectNode$‘, ‘bytes‘, ‘0‘, ‘91484‘);

set num = num + 1;

set beginId = beginId + 1;

set detailId = detailId + 1;

set actinstId = actinstId + 1;

set varinstId = varinstId + 1;

end while;

end$$

delimiter ;

 

发现这activiti傻的,取出所有待办数据,然后在程序里边过滤数据,然后再做分页查询;

生成了1000数据,测试一把:

 

明显地分页优化完胜,问了下LTW优化的兄弟;回答是:因为原有的配置,就是不加LoadTimeWeaver的配置,会导致ORM的LazyLoad无效,等同于所有关联的实体都会被加载;

 

分页优化还要改很多代码,activiti缺乏灵活性真的有体会了;

不行咱就自己写SQL;

先试试代码上改吧;

/org/activiti/db/mapping/entity/HistoricProcessInstance.xml竟然没有关联act_hi_taskinst的地方;

 

什么鬼,这能算优秀框架吗?我加个.variableValueEquals("ASSIGNEE_", String.valueOf(userInfo.getId()))查询,出来这样的语句,select count(distinct RES.ID_) from ACT_HI_PROCINST RES inner join ACT_HI_VARINST A0 on RES.PROC_INST_ID_ = A0.PROC_INST_ID_ WHERE RES.END_TIME_ IS NULL and ( exists(select LINK.USER_ID_ from ACT_HI_IDENTITYLINK LINK where USER_ID_ = ? and LINK.PROC_INST_ID_ = RES.ID_) ) and A0.NAME_= ? and A0.VAR_TYPE_ = ? and A0.TEXT_ = ?,Parameters: 324(String), ASSIGNEE_(String), string(String), 324(String),什么龟?

 

还得深入mapper.xml文件看看;

又纠结了,这怎么办?

时间: 2024-10-06 04:04:05

工作流性能优化(敢问activiti有扩展性?)(2)的相关文章

工作流性能优化(敢问activiti有扩展性?)(3)

2015/4/20 周末回去想了下,hibernate.mybatis.jdbc,都行,最终定了用mybatis,谁叫它这么优雅,acvtiviti是依赖了mybatis的,就不用再引入包了: 看了配置文件,之前配置的是jpa,再配置mybatis,配置文件就显得臃肿,很乱了:用jpa吧,貌似也不赖: 再写一个Repository: 写SQL的时候用到了,知识点: instr:instr(t.DESCRIPTION_, 'conditionCountersign') > 0 mysql查询最后一

工作流性能优化(敢问activiti有扩展性?)(1)

工作流待办(首页待办列表),加载缓慢,activiti本机,看了代码又是全部数据加载到内存,然后代码过滤,我为什么又说又呢? 用VisualVM做性能测试:   之前同事给的解决方案: 1.把"spring-instrument-3.2.1.RELEASE.jar"放到tomcat的lib目录下: 2.Windows: 修改tomcat\bin\catalina.bat文件,"set JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER%"后

C#大型电商项目优化(三)——扩展性与支付

上一篇文章引来不少非议,笔者并非对EF有看法,而是针对不同的业务场景和框架背景,挑选不同的方案.每个方案都有其优势劣势,挑选最快速,最简单的方案,是笔者的初衷. 看评论也是学习的过程,然而有些只做评价,却不道明原委的评论,也确实让笔者感受到了些许来自世界的恶意^_^ 开个玩笑,下面进入正题,之前系统的支付部分只需要支持支付宝和财付通,且支付代码是写在一个页面文件里的,也就是说,这个页面文件包含了支付宝和财付通的支付请求.支付同步回调和异步回调.且不说代码混乱可读性差,其可扩展性也实在不敢恭维.其

火狐的34条军规(前端性能优化)

性能优化:          1.稳定性 2.扩展性 3.优化 yelow: Chrome     F12     NetWork         需要经验 firefox         YSLow     yahoo 安装插件      必须有firebug        3.6之后的火狐都不兼容 标签 yslow.org/mobile 不能检测https协议的网址 对咱们没有影响 工具:学习的东西 雅虎给出了优化网站加载速度的34条法则(包括Yslow规则22条) 详细说明,下载转发 po

深入NGINX:我们如何设计它的性能和扩展性

英文原文:Inside NGINX: How We Designed for Performance & Scale 为了更好地理解设计,你需要了解NGINX是如何工作的.NGINX之所以能在性能上如此优越,是由于其背后的设计.许多web服务器和应用服务器使用简单的线程的(threaded).或基于流程的(process-based)架构, NGINX则以一种复杂的事件驱动(event-driven)的架构脱颖而出,这种架构能支持现代硬件上成千上万的并发连接. Inside NGINX info

asp.net的10个提升性能或扩展性的秘密(一) 转自网络

简介 Asp.net有很多值得你挖掘的“秘密”,当你发现了它们,将会给你网站的性能和可扩展性带来巨大提升!例如,对于Membership以及Profile提供程序有一些秘密的瓶颈,它们很容易被解决,从而使认证和授权更加快速.另外,asp.net的http管线可以为每一个请求作处理,防止执行了某些不必要的代码而遭受攻击.不只是这些,asp.net工作进程能够突破默认限制,从而完全发挥它的威力.在浏览器端(不是在服务器端)的页面分段输出缓存能显著减少由于请求访问所需要占用的大量下载时间.在需要的用户

【Java/Android性能优 4】PreloadDataCache支持预取的数据缓存,使用简单,支持多种缓存算法,支持不同网络类型,扩展性强

本文转自:http://www.trinea.cn/android/preloaddatacache/ 本文主要介绍一个支持自动向前或向后获取新数据的缓存的使用及功能.Android图片内存缓存可见ImageCache. 主要特性:(1).使用简单  (2).可自动预取新数据  (3).可选择多种缓存算法(包括FIFO.LIFO.LRU.MRU.LFU.MFU等15种)或自定义缓存算法  (4).省流量性能佳(有且仅有一个线程获取数据)  (5).支持不同类型网络处理  (6)缓存可序列化到本地

【Java/Android性能优5】 Android ImageCache图片缓存,使用简单,支持预取,支持多种缓存算法,支持不同网络类型,扩展性强

本文转自:http://www.trinea.cn/android/android-imagecache/ 主要介绍一个支持图片自动预取.支持多种缓存算法.支持二级缓存.支持数据保存和恢复的图片缓存的使用.功能及网友反馈的常见问题解答. 与Android LruCache相比主要特性:(1). 使用简单  (2). 轻松获取及预取新图片  (3). 包含二级缓存  (4). 可选择多种缓存算法(FIFO.LIFO.LRU.MRU.LFU.MFU等 13种)或自定义缓存算法  (5). 可方便的保

MySQL 复制 - 性能与扩展性的基石 1:概述及其原理

原文:MySQL 复制 - 性能与扩展性的基石 1:概述及其原理 1. 复制概述 MySQL 内置的复制功能是构建基于 MySQL 的大规模.高性能应用的基础,复制解决的基本问题是让一台服务器的数据与其他服务器保持同步. 接下来,我们将从复制概述及原理.复制的配置.常见的问题及解决方法来学习 MySQL 的复制功能. 1.1 复制解决的问题 下面是复制常见的用途: 数据分布.Mysql 复制通常不会对带宽造成很大压力,但在 5.1 版本中引入的基于行的复制会比传统的基于语句的复制模式产生更大的带