2015/4/20

周末回去想了下,hibernate、mybatis、jdbc,都行,最终定了用mybatis,谁叫它这么优雅,acvtiviti是依赖了mybatis的,就不用再引入包了;

看了配置文件,之前配置的是jpa,再配置mybatis,配置文件就显得臃肿,很乱了;用jpa吧,貌似也不赖;

再写一个Repository;

写SQL的时候用到了,知识点:

instr:instr(t.DESCRIPTION_, 'conditionCountersign') > 0

mysql查询最后一条记录,不能用orderby:

需求:要取a1的最后一条数据来关联,语句如下;

解决:不能在inner join里边用order by xxx limit 1;

折中解决:用时间来限制;a1.START_TIME_>a2.START_TIME_

select distinct RES.*, a1.ID_, a2.ID_ from ACT_HI_PROCINST RES inner join ACT_HI_ACTINST a1 on (a1.PROC_INST_ID_ = RES.PROC_INST_ID_ and a1.ACT_TYPE_ != 'endEvent')

inner join ACT_RU_TASK t on (a1.TASK_ID_=t.ID_ and instr(t.DESCRIPTION_, 'conditionCountersign') > 0)

inner join ACT_HI_ACTINST a2 on (a1.ACT_ID_=a2.ACT_ID_ and a1.START_TIME_>a2.START_TIME_ and a2.ASSIGNEE_='324')

where RES.END_TIME_ is null

and exists (select LINK.USER_ID_ from ACT_HI_IDENTITYLINK LINK where USER_ID_ = '324' and LINK.PROC_INST_ID_ = RES.ID_) order by START_TIME_ desc;

jpa映射activiti的实体,各种报错;

好麻烦,jpa要写实体,要写HQL,原来我都写好SQL了,还要转换为HQL,hibernate真麻烦;

慢慢拷贝表字段写实体,每个实体要继承原有的entity;

先写一个测试用例,跑通了再说,别连查询都查不了,就浪费时间了;贴一些主要的代码:

实体:

Repository:

测试用例:

可以哦:

那开始慢慢写实体吧,写好再改HQL;

写好了HQL,开始测试:

报错:

Caused by: java.lang.IllegalArgumentException: node to traverse cannot be null!

摸不着头脑,先精简语句,先调通上半部分的union再说;

还是一样;

问度娘;度娘说是HQL写错了,哪里错了,她也不说,真是的;

再次精简:

还是一样;

再次精简:

还是一样;

哥,多了个左括号;继续奋战;

再加SQL:

加参数,加排序,很顺利;

另一个union问题就很多,有点绝望;

换用jdbc试试;

遇到的错误:

错误代码: 1248

Every derived table must have its own alias

解决:

select count(0) as total from (xxx);后边要带别名;

select count(0) as total from (xxx) dd;

很快就写好了,原生SQL就是好;

jdbc的dao层:

    /*** 分页查询待办工作流记录* @param involvedUser* @param firstResult* @param maxResults* @return*/public List<HistoricProcessInstanceEntity> qryUnfinishedByInvolvedUser(HistoricProcessInstanceQuery query){StringBuilder sql = new StringBuilder();sql.append(" select  ");sql.append(HistoricProcessInstanceSQLFragment.baseColumnList());sql.append(" from (");sql.append("(select RES.* from ACT_HI_PROCINST RES ");sql.append("where RES.END_TIME_ is null ");sql.append("  and (exists (select LINK.USER_ID_ from ACT_HI_IDENTITYLINK LINK where USER_ID_ = ? and LINK.PROC_INST_ID_ = RES.PROC_INST_ID_)) ");sql.append("  and exists (select 1 from ACT_RU_TASK t where t.PROC_INST_ID_=RES.ID_ and t.ASSIGNEE_=? order by t.ID_ asc limit 1)) ");sql.append(" union ");sql.append(" (select distinct RES.* from ACT_HI_PROCINST RES inner join ACT_HI_ACTINST a1 on (a1.PROC_INST_ID_ = RES.PROC_INST_ID_ and a1.ACT_TYPE_ != 'endEvent') ");sql.append("     inner join ACT_RU_TASK t on (a1.TASK_ID_=t.ID_ and instr(t.DESCRIPTION_, 'conditionCountersign') > 0)  ");sql.append("     inner join ACT_HI_ACTINST a2 on (a1.ACT_ID_=a2.ACT_ID_ and a1.START_TIME_>a2.START_TIME_ and a2.ASSIGNEE_=?) ");sql.append("     where RES.END_TIME_ is null  ");sql.append("     and exists (select LINK.USER_ID_ from ACT_HI_IDENTITYLINK LINK where USER_ID_ = ? and LINK.PROC_INST_ID_ = RES.ID_)) ");sql.append("order by START_TIME_ desc) dd ");List<Object> param = new ArrayList<Object>();param.add(query.getInvolvedUser());param.add(query.getInvolvedUser());param.add(query.getInvolvedUser());param.add(query.getInvolvedUser());String countSql = PageUtils.getCountSQL(sql.toString());logger.info("About to excute sql=\n{}\n{}", countSql, BaseUtils.printList(param));Integer total = baseDao.getJdbcTemplate().queryForObject(countSql, param.toArray(), Integer.class);query.setTotalRecord(total);// 分页设置
        PageUtils.buildPageSqlForMysql(sql, query);logger.info(" About to excute sql=\n{}\n{}", sql.toString(), BaseUtils.printList(param));List<HistoricProcessInstanceEntity> datas = baseDao.getJdbcTemplate().query(sql.toString(), param.toArray(), new BeanPropertyRowMapper<HistoricProcessInstanceEntity>(HistoricProcessInstanceEntity.class));return datas;}

启动项目测试:

严重: Servlet.service() for servlet [spring] in context with path [] threw exception [Handler processing failed; nested exception is java.lang.NoSuchMethodError: com.sinotaiyo.srpm.activiti.DetailBuilder.BuildWorkflowDetailByEntity(Lorg/activiti/engine/impl/persistence/entity/HistoricProcessInstanceEntity;)Lcom/sinotaiyo/srpm/activiti/WorkflowDetail;] with root cause

java.lang.NoSuchMethodError: com.sinotaiyo.srpm.activiti.DetailBuilder.BuildWorkflowDetailByEntity(Lorg/activiti/engine/impl/persistence/entity/HistoricProcessInstanceEntity;)Lcom/sinotaiyo/srpm/activiti/WorkflowDetail;

方法是写好的,debug进去是用代理模式;

javap –s DetailBuilder

貌似一样的啊;

折腾了好久,用Run As Server里边的tomcat就可以,但用maven插件的方式启动就报错;

为啥呢?

优化到此为止,告一段落。

疑问:

1、jpa的注解方式写DAO层可以用原生SQL吗?HQL是这样的:

2、activiti的表字段和属性名虽然不一样,但还是可以识别,不算折磨人,为什么不能一样呢?一样不是更好吗?所有地方都可以拷贝,不用拷贝了修改,保留下划线可以理解,要是怕字段过长的话,别定那么长的字段就可以了,至少要保持一致,一致之后很多自动化的事情就好办了,比如写代码生成器;

3、设计良好的数据库,即使再复杂的查询也应该是很好写,为何这里的待办查询这么恐怖?

总结:

1、 新入职,接手已有项目,就是这么坎坷,习惯就好;

2、 论测试的重要性,一个语句测多少遍才测通啊,写测试还是非常有必要的,负责任的提现,但之前公司的开发人员,工作1年就当技术主管,代码都没写几行就主管,真心无语,还有个工作1年就封为架构师,写个JavaBean属性全是public,都只是加班积极点,爱装13,我也是醉了;

3、 排错的简单做法就是先做减法再做加法,不用开根号,呵呵简单吧

4、 能用SQL一次做完的事情就用SQL做,像下图这种,完全可以在语句里边过滤排序吧;

转载于:https://www.cnblogs.com/yejq/p/4451167.html

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

  1. 数据库性能优化八大方案,你知道几个

    前言 毫不夸张的说咱们后端工程师,无论在哪家公司,呆在哪个团队,做哪个系统,遇到的第一个让人头疼的问题绝对是数据库性能问题.如果我们有一套成熟的方法论,能让大家快速.准确的去选择出合适的优化方案,我相 ...

  2. php ci框架查询数据库占用大量的cpu,CodeIgniter 性能优化

    背景:部署一套PHP微服务接口,需要兼顾性能,开发效率,扩展性.权衡后选择了CodeIgniter:同时优化框架的默认启动项,在qps1000+的压力下整个启动时间优化到5ms左右. 一.选型 背景: ...

  3. 十位数据库专家:如何透过性能优化看系统架构的合理性

    十位数据库专家:如何透过性能优化看系统架构的合理性 本文首发于一年多以前,由当时十位民生银行的数据库专家合著,系统地从架构的角度对数据库性能问题进行分析解读b,是多年项目开发和运维工作的经验总结.文章 ...

  4. 后端思维之数据库性能优化方案

    前言 毫不夸张的说咱们后端工程师,无论在哪家公司,呆在哪个团队,做哪个系统,遇到的第一个让人头疼的问题绝对是数据库性能问题.如果我们有一套成熟的方法论,能让大家快速.准确的去选择出合适的优化方案,我相 ...

  5. 8大数据库性能优化方案,YYDS

    目录 前言 为什么数据库会慢? 应该站在哪个层面思考优化? 八大方案总结 结束 前言 毫不夸张的说咱们后端工程师,无论在哪家公司,呆在哪个团队,做哪个系统,遇到的第一个让人头疼的问题绝对是数据库性能问 ...

  6. 针不戳,数据库性能优化八大方案。

    前言 毫不夸张的说咱们后端工程师,无论在哪家公司,呆在哪个团队,做哪个系统,遇到的第一个让人头疼的问题绝对是数据库性能问题.如果我们有一套成熟的方法论,能让大家快速.准确的去选择出合适的优化方案,我相 ...

  7. 软件系统扩展性_我如何将软件系统的性能扩展35,000%

    软件系统扩展性 重点 (Top highlight) 一天处理超过$ 20,000,000 (Processing over $20,000,000 in a single day) A previo ...

  8. 拆解交易系统--性能优化,安全加固与弹性扩缩容

    点击上方蓝色字体,选择"设为星标" 优质文章,及时送达 前几篇文章我们拆解了交易系统架构层次的设计方案,对于代码细节我们讨论很很少,今天基于几个方面简短的介绍一下,未来有时间可以针 ...

  9. mysql 基于语句的复制_MySQL 复制 - 性能与扩展性的基石 1:概述及其原理

    1. 复制概述 MySQL 内置的复制功能是构建基于 MySQL 的大规模.高性能应用的基础,复制解决的基本问题是让一台服务器的数据与其他服务器保持同步.接下来,我们将从复制概述及原理.复制的配置.常 ...

最新文章

  1. 中国移动用户能不能用WCDMA网?(世界杯与通信2)
  2. Android设置多个定时器时只有最后一个定时器有效的问题
  3. Django框架----分页器(paginator)
  4. 为什么说雅虎的未来在于回归媒体的初衷
  5. 先排列再排行 html,三国中猛将的权威排名 颜良为何排列第二
  6. oracle对查询结果求和_Oracle 闪回技术详解
  7. asp.net gridview 模板列 弹出窗口编辑_如何使用极速PDF编辑器的注释工具?
  8. linux命令行sip电话,基于嵌入式Linux和MiniGUI的SIP电话设计
  9. Windows C盘清理
  10. 孤荷凌寒自学python第二十一天初识python的类
  11. Spring Cloud Loadbalancer
  12. jqgrid实现表头合并功能
  13. 【人工智能AI】二、NoSQL 基础知识《NoSQL 企业级基础入门与进阶实战》
  14. 1005【顺序结构】马克与爸爸的年龄问题
  15. 2020.7.18【算协集训】[第1次积分赛]
  16. 树袋熊无线网络打印服务器,树袋熊
  17. 看完刘未鹏的暗时间之后的感悟
  18. 估值远低于千亿美元,是小米不行还是这批投资者不行?
  19. 程序员成熟的标志——作为自己的指向标!
  20. poj迷宫游戏c语言代码,ACM/ICPC 之 BFS-简单障碍迷宫问题(POJ2935)

热门文章

  1. 前端开发之模块化初探
  2. [上架] iOS 上架更新版本号建议
  3. 公共语言运行库(CLR)和中间语言(IL)(一)
  4. HAL——硬件抽象层读书笔记
  5. 虚拟机 centos 7 nginx安装
  6. 楼天成夺Facebook黑客杯季军,已被Facebook录用得到美国绿卡
  7. 手把手教你感情企划书
  8. 终于有人把数据湖讲明白了
  9. 什么是机器学习?有哪些应用?终于有人讲明白了
  10. 教程 | 如何优雅而高效地使用Matplotlib实现数据可视化