工作流待辦(首頁待辦列表),加載緩慢,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%”后添加一行“set JAVA_OPTS=%JAVA_OPTS% -javaagent:%CATALINA_HOME%\lib\spring-instrument-3.2.1.RELEASE.jar”;
Linux: 修改tomcat/bin/catalina.sh文件,“# Uncomment the following line to make the umask available when using the”前添加一行“JAVA_OPTS=-javaagent:$CATALINA_HOME/lib/spring-instrument-3.2.1.RELEASE.jar”;
3、修改項目中的spring-context.xml文件,“<bean class="com.sinotaiyo.srpm.ApplicationContextUtil" />”后添加一行“<context:load-time-weaver weaver-class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>”,“<property name="dataSource" ref="dataSource" />”后添加一行“<property name="loadTimeWeaver" ref="loadTimeWeaver"/>”;
原理:
AspectJ提供了兩種切面織入方式,第一種通過特殊編譯器,在編譯期,將AspectJ語言編寫的切面類織入到Java類中,可以通過一個Ant或Maven任務來完成這個操作;第二種方式是類加載期織入,也簡稱為LTW(Load Time Weaving)。
Spring之LoadTimeWeaver——一個需求引發的思考
試試這樣配置能不能啟動項目先;
先用外置的tomcat配置好啟動項目試試;
改好,啟動報錯:
嚴重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
java.lang.IllegalStateException: Must start with Java agent to use InstrumentationLoadTimeWeaver. See Spring documentation.
at org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver.addTransformer(InstrumentationLoadTimeWeaver.java:87)
修改tomcat配置為使用外置的tomcat;
也不行;
linux下可以;
修改tomat配置:
加上啟動vm參數,就可以了;
tomcat7-maven-plugin啟動也加入啟動vm參數就可以;
安裝VisualVM;
http://visualvm.java.net/download.html,下載多國語言包的版本,解壓就可以用了;
啟動,需要jdk7;
雖然機器上已經安裝了java_home,但還是要自己修改配置;搜索:visualvm_jdkhome
"D:\J2EE\visualvm_138\etc\visualvm.conf"
還原原來的配置,備份:
-javaagent:D:\J2EE\apache-tomcat-6.0.43\lib\spring-instrument-3.2.1.RELEASE.jar
生成10萬數據供測試:
首先,找出Hibernate打印SQL及附加參數
在Hibernate的配置文件hibernate.cfg.xml中有3個設置項跟顯示SQL語句相關,他們的值都是boolean值:
1、show_sql:是否顯示SQL語句
2、format_sql: 是否格式化輸出字符串,增強SQL的可讀性
3、use_sql_comments:是否顯示注釋,用於指示出是什么操作產生了這個SQL語句。
如果設置了show_sql=true的話默認只打印SQL語句不會打印參數:
如果需要打印參數請在log4j配置文件:log4j.properties中加入:
log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
log4j.loggerorg.hibernate.type.descriptor.sql.BasicExtractor=TRACE
如果需要查看查詢中命名參數的值,繼續加入:
log4j.logger.org.hibernate.engine.QueryParameters=DEBUG
log4j.logger.org.hibernate.engine.query.HQLQueryPlan=DEBUG
接下來奉上全部配置:
log4j.rootLogger=info, CA
# ConsoleAppender
log4j.appender.CA=org.apache.log4j.ConsoleAppender
log4j.appender.CA.layout=org.apache.log4j.PatternLayout
log4j.appender.CA.layout.ConversionPattern=%d{hh\:mm\:ss,SSS} [%t] %-5p %c %x - %m%n
#為了顯示參數
log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
log4j.loggerorg.hibernate.type.descriptor.sql.BasicExtractor=TRACE
#查看查詢中命名參數的值
log4j.logger.org.hibernate.engine.QueryParameters=DEBUG
log4j.logger.org.hibernate.engine.query.HQLQueryPlan=DEBUG
使用時只需要將hibernate.cfg.xml中的show_sql設置為true然后將紅色代碼復制到配置文件中即可。
剛剛問了工作流走的是mybatis,不是hibernate,好吧;
debug一下跟一下sql;
還是度娘好,搜出來了;
Activiti中徹底解決待辦事項列表查詢復雜、API不友好的設計方案
分析上述缺點和需求后,我們認為通過API方式進行查詢的話,總是有各種缺陷,因此把目標放在數據庫上,如果能通過定義視圖的方式解決問題,那么將徹底解決查詢的方便性、靈活性、通用性問題。
經過分析Activiti的數據庫表,我們發現並不復雜,和待辦事項有關系的表,包括ACT_RU_TASK、ACT_RU_IDENTITYLINK,ACT_RU_TASK中存儲了任務相關信息,ACT_RU_IDENTITYLINK中存儲了候選組和候選人信息,這里面一個比較重要的問題就是,Activiti中的候選組、候選人如何跟系統中的用戶、組織、角色對應的問題,本文提供的解決方案,假定系統中有一張名為SYS_ROLE_USER的表,該表中存儲了角色和用戶的對應關系,並且Activiti中的候選組和角色是同一個概念,開發者的系統中具體是什么情況,需要開發者舉一反三,本文僅提供一個設計思路。
找sql困難,就從頁面找新增工作流的地方,找到對應的代碼,寫程序生成就可以了;
原來的開發人員說在加載待辦的代碼里邊加個for循環,重復加載待辦數據,這個方案后邊試試;
MD,js兼容性問題;
創建個工作流道路也很長啊;
代碼也封裝得非常好,一時半會摸不着頭腦,怎么辦呢?
明天繼續;