工作流性能优化(敢问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 [org.springframework.jdbc.datasource.DriverManagerDataSource@192db17]]
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文件看看;
又纠结了,这怎么办?
工作流性能优化(敢问activiti有扩展性?)(2)的更多相关文章
- 工作流性能优化(敢问activiti有扩展性?)(3)
2015/4/20 周末回去想了下,hibernate.mybatis.jdbc,都行,最终定了用mybatis,谁叫它这么优雅,acvtiviti是依赖了mybatis的,就不用再引入包了: 看了配 ...
- 工作流性能优化(敢问activiti有扩展性?)(1)
工作流待办(首页待办列表),加载缓慢,activiti本机,看了代码又是全部数据加载到内存,然后代码过滤,我为什么又说又呢? 用VisualVM做性能测试: 之前同事给的解决方案: 1.把&quo ...
- C#大型电商项目优化(三)——扩展性与支付
上一篇文章引来不少非议,笔者并非对EF有看法,而是针对不同的业务场景和框架背景,挑选不同的方案.每个方案都有其优势劣势,挑选最快速,最简单的方案,是笔者的初衷. 看评论也是学习的过程,然而有些只做评价 ...
- 深入NGINX:我们如何设计它的性能和扩展性
为了更好地理解设计,你需要了解NGINX是如何工作的.NGINX之所以能在性能上如此优越,是由于其背后的设计.许多web服务器和应用服务器使用简单的线程的(threaded).或基于流程的 (proc ...
- Java并发编程:性能、扩展性和响应
1.介绍 本文讨论的重点在于多线程应用程序的性能问题.我们会先给性能和扩展性下一个定义,然后再仔细学习一下Amdahl法则.下面的内容我们会考察一下如何用不同的技术方法来减少锁竞争,以及如何用代码来实 ...
- 【Java/Android性能优5】 Android ImageCache图片缓存,使用简单,支持预取,支持多种缓存算法,支持不同网络类型,扩展性强
本文转自:http://www.trinea.cn/android/android-imagecache/ 主要介绍一个支持图片自动预取.支持多种缓存算法.支持二级缓存.支持数据保存和恢复的图片缓存的 ...
- 【Java/Android性能优 4】PreloadDataCache支持预取的数据缓存,使用简单,支持多种缓存算法,支持不同网络类型,扩展性强
本文转自:http://www.trinea.cn/android/preloaddatacache/ 本文主要介绍一个支持自动向前或向后获取新数据的缓存的使用及功能.Android图片内存缓存可见I ...
- MySQL 复制 - 性能与扩展性的基石:概述及其原理
原文:MySQL 复制 - 性能与扩展性的基石:概述及其原理 1. 复制概述 MySQL 内置的复制功能是构建基于 MySQL 的大规模.高性能应用的基础,复制解决的基本问题是让一台服务器的数据与其他 ...
- Zend server最大化应用程序的性能、扩展性和可用性
如果我有8个小时去砍到一棵树,我会花6个小时磨斧子”——林肯(美国总统) 你可以知道? 世界页面访问量的峰值超过7000万每分钟. CloudFare公司服务器问题,导致785000站点崩溃一小时. ...
随机推荐
- 前端编码规范 -- html篇
文档类型 推荐使用 HTML5 的文档类型申明: <!DOCTYPE html> (建议使用 text/html 格式的 HTML.避免使用 XHTML.XHTML 以及它的属性,比如 a ...
- Dedecms本地上传缩略图无法自动添加水印的解决方法
客户遇到一个问题,DEDECMS(V5.7)后台添加文档时,本地上传缩略图无法自动添加水印(系统设置里的图片水印设置没有问题),找了半天,终于找到了解决方法,留个记号: 打开dede/archives ...
- 使用pods添加第三方的时候,出现ld: library not found for -lpop
ld: library not found for -lpop 错误,是在使用pods添加第三方的时候,出现的编译错误,同时伴随着的是error: linker command failed with ...
- Python使用Zero-Copy和Buffer Protocol实现高性能编程
无论你程序是做什么的,它经常都需要处理大量的数据.这些数据大部分表现形式为strings(字符串).然而,当你对字符串大批量的拷贝,切片和修改操作时是相当低效的.为什么? 让我们假设一个读取二进制数据 ...
- sortable结合angularjs实现拖动排序
记录拖动排序 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- RetryException
public class RetryException extends Exception { public TempestRetryException(Throwable e) { super(e) ...
- 一步一步在Windows中使用MyCat负载均衡
一步一步在Windows中使用MyCat负载均衡 http://www.cnblogs.com/zhangs1986/p/6408981.html mycat+sqlServer简单demo配置 ...
- 1160: sundari && Shortest path HDU - 4479
http://gdutcode.sinaapp.com/problem.php?id=1160 http://acm.hdu.edu.cn/showproblem.php?pid=4479 35 51 ...
- .NET Core微服务 权限系统+工作流(二)工作流系统
一.前言 接上一篇 .NET Core微服务 权限系统+工作流(一)权限系统 ,再来一发 工作流,我在接触这块开发的时候一直好奇它的实现方式,翻看各种工作流引擎代码,探究其实现方式,个人总结出来一个核 ...
- 利用XML序列化和Asp.Net Web缓存实现站点配置文件
我们经常会遇到这样的场景: 今天来了个业务,需要加一个字段,但是考虑的以后可能有变动,需要配成“活”的. 一般最初的做法就是加一个配置到Web.Config文件的AppSettings中去.但是这样有 ...