日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2025/3/17 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 工作流性能优化(敢问activiti有扩展性?)(3) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2015/4/20

周末回去想了下,hibernate、mybatis、jdbc,都行,最終定了用mybatis,誰叫它這么優(yōu)雅,acvtiviti是依賴了mybatis的,就不用再引入包了;

看了配置文件,之前配置的是jpa,再配置mybatis,配置文件就顯得臃腫,很亂了;用jpa吧,貌似也不賴;

?

再寫一個Repository;

寫SQL的時候用到了,知識點:

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

mysql查詢最后一條記錄,不能用orderby:

?

需求:要取a1的最后一條數(shù)據(jù)來關(guān)聯(lián),語句如下;

解決:不能在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了,還要轉(zhuǎn)換為HQL,hibernate真麻煩;

慢慢拷貝表字段寫實體,每個實體要繼承原有的entity;

?

先寫一個測試用例,跑通了再說,別連查詢都查不了,就浪費時間了;貼一些主要的代碼:

實體:

Repository:

測試用例:

可以哦:

那開始慢慢寫實體吧,寫好再改HQL;

寫好了HQL,開始測試:

報錯:

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

摸不著頭腦,先精簡語句,先調(diào)通上半部分的union再說;

還是一樣;

問度娘;度娘說是HQL寫錯了,哪里錯了,她也不說,真是的;

再次精簡:

還是一樣;

再次精簡:

還是一樣;

哥,多了個左括號;繼續(xù)奮戰(zhàn);

再加SQL:

加參數(shù),加排序,很順利;

?

另一個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);// 分頁設(shè)置 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插件的方式啟動就報錯;

為啥呢?

優(yōu)化到此為止,告一段落。

疑問:

1、jpa的注解方式寫DAO層可以用原生SQL嗎?HQL是這樣的:

2、activiti的表字段和屬性名雖然不一樣,但還是可以識別,不算折磨人,為什么不能一樣呢?一樣不是更好嗎?所有地方都可以拷貝,不用拷貝了修改,保留下劃線可以理解,要是怕字段過長的話,別定那么長的字段就可以了,至少要保持一致,一致之后很多自動化的事情就好辦了,比如寫代碼生成器;

3、設(shè)計良好的數(shù)據(jù)庫,即使再復(fù)雜的查詢也應(yīng)該是很好寫,為何這里的待辦查詢這么恐怖?

總結(jié):

1、 新入職,接手已有項目,就是這么坎坷,習(xí)慣就好;

2、 論測試的重要性,一個語句測多少遍才測通啊,寫測試還是非常有必要的,負責(zé)任的提現(xiàn),但之前公司的開發(fā)人員,工作1年就當(dāng)技術(shù)主管,代碼都沒寫幾行就主管,真心無語,還有個工作1年就封為架構(gòu)師,寫個JavaBean屬性全是public,都只是加班積極點,愛裝13,我也是醉了;

3、 排錯的簡單做法就是先做減法再做加法,不用開根號,呵呵簡單吧;

4、 能用SQL一次做完的事情就用SQL做,像下圖這種,完全可以在語句里邊過濾排序吧;

轉(zhuǎn)載于:https://www.cnblogs.com/yejq/p/4451167.html

總結(jié)

以上是生活随笔為你收集整理的工作流性能优化(敢问activiti有扩展性?)(3)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。