日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
加速Java應用開發(fā)1—Spring調(diào)試啟動速度

在調(diào)試spring應用時,動輒幾十秒,甚至有的應用上分鐘的啟動速度,會讓整個調(diào)試速度慢下來了。等待時間讓人抓狂。不知道大家是如何加速spring應用調(diào)試速度的,在此分享下我的一次加速過程。歡迎補充指正。

環(huán)境

配置:

 
 
 
  1. thinkpad t410 
  2. 內(nèi)存:4G內(nèi)存 
  3. CPU:Intel P8700 雙核2.53GHZ 
  4. 系統(tǒng):WIN XP 
  5. 開發(fā)工具:Intellij IDEA 12.0.4 
  6. Maven + spring3.2.3 + hibernate4.2.2+Spring data jpa 1.3.1 

未優(yōu)化前spring容器啟動速度:

16890毫秒 =(14609毫秒(ContextLoaderListener加載的)+2281毫秒(Springmvc加載的)

優(yōu)化后spring容器啟動速度:

7797毫秒 =(6563毫秒(ContextLoaderListener加載的)+1234毫秒(Springmvc加載的)

速度提升了一半多,而且以后在調(diào)試階段,大部分就停留在這個時間左右。

注意:此處只是spring容器啟動速度,不包括服務器啟動時的速度。因為我的系統(tǒng)好久沒清理了,否則可能速度會更快。

加速Spring

1、掃描注解Bean

寫比較精確的掃描路徑,如掃描@Service和@Repository:

 
 
 
  1.  

這樣寫,比直接寫com.sishuok.es速度要快很多,因為這樣掃描的class會很少。

還有,如springmvc 掃描:

 
 
 
  1.  

此處只掃描項目的web.controller包,這樣掃描的class也很少。

還有如事務的掃描:

 
 
 
  1. execution(* com.sishuok.es..service..*+.*(..) 

還有如使用spring data jpa時也是這樣:

 
 
 
  1.             base-package="com.sishuok.es.**.repository" 

這里需要大家有良好的分包,否則無法優(yōu)化。

2、延遲加載你的bean

常見的方式是在配置文件中在上加:

 
 
 
  1. default-lazy-init="true" 

2.1、這種方式只對xml聲明的bean有效;

2.2、注解掃描的bean無效,如@Service,需要使用@Lazy指定,但這樣太麻煩,需要一個一個的配置;

2.3、還有就是如果你使用springmvc,lazy-init幾乎沒啥用,因為springmvc容器在啟動時會通過 DefaultAnnotationHandlerMapping查找相關的帶有@RequestMapping的bean并注冊請求映射;所以相關的如 Service/Repository也級聯(lián)非lazy-init;

因此我寫了個工具:SpeedUpSpringProcessor,其作用是:lazy-init所有bean,包括注解的bean;對于【2.3】后續(xù)介紹解決方案;具體配置請參考***。

3、移除調(diào)試階段不相干的bean

有些bean在調(diào)試階段我們并不需要,如我們在測試用戶模塊時,可能不需要測試權限模塊;此時我們可以把不相干的bean移除掉;具體配置請參考***。

這樣的話,可以考慮如把@Controller的bean移除,這樣的話如Service/Repository就可以lazy-init了。

常見的可以移除的如:

  • 任務調(diào)度器(quartz)、AOP相關等等;
  • 此處需要合理的分包,否則無法應用或應用困難。

4、刪除無用屬性

如在測試shiro時,可能不需要remember的功能,此時可以把屬性移除/禁用(即將值設置為false);具體配置請參考***。

5、替換正式機數(shù)據(jù)源為最快的數(shù)據(jù)源

如此處我把DruidDataSource數(shù)據(jù)源直接替換為org.springframework.jdbc.datasource.DriverManagerDataSource,這個速度最快;

6、替換jackson為fastjson

此處測試了下jackson速度比fastjson慢許多的。支持國產(chǎn)。

7、項目分模塊開發(fā) 

如果項目模塊比較多,可以考慮放棄注解,而使用xml配置方式+約定。因為實際做項目時可能把配置分到多個配置文件,此時我嘗試了下合并到一個,幾乎沒啥速度提升,所以還是分開存好。

到此spring容器啟動速度算是比較快了,不知道大家還有沒有好的策略。歡迎指點。

加速Hibernate/JPA

此處以org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean為例。

1、 精確化packagesToScan

和之前的spring一樣,寫比較精確的實體掃描路徑

 
 
 
  1.  

2、generateDdl=false 禁用掉

沒必要每次都生成ddl

3、 禁用JSR-303驗證

默認情況下是AUTO,會根據(jù)classpath下是否有jsr-303實現(xiàn)來自動注冊;

 
 
 
  1.  
  2.  
  3.  
  4.  
  5.  

此處validator 直接引用我們項目中定義的,而不是讓hibernate再去new一個。而且也不推薦在這驗證,具體為什么,請參考我的《我是這樣認識注解和XML的》。

4、如果你的項目都是注解,此時就沒必要掃描hbm了,禁用掉

 
 
 
  1.  

5、如果你不使用NamedQuery,禁用掉

 
 
 
  1.  

6、在調(diào)試階段禁用掉二級緩存

通過如上手段,我的spring容器啟動速度提升了一半多。大家還有好的優(yōu)化策略嗎?如果有歡迎補充。具體配置請參考***。

之前提到的SpeedUpSpringProcessor配置

 
 
 
  1.  
  2.  
  3.      
  4.      
  5.          
  6.              
  7.             scheduler 
  8.             autoClearDeletedRelationTrigger 
  9.             autoClearExpiredOrDeletedmMessageTrigger 
  10.             autoClearDeletedRelationJob 
  11.             autoClearExpiredOrDeletedmMessageJob 
  12.   
  13.              
  14.             rememberMeCookie 
  15.             rememberMeManager 
  16.             shiroCacheManager 
  17.             sessionValidationScheduler 
  18.             sessionValidationScheduler 
  19.              
  20.             multipartResolver 
  21.   
  22.              
  23.             druidStatInterceptor 
  24.             druidAdvisor 
  25.          
  26.      
  27.      
  28.      
  29.      
  30.          
  31.              
  32.             sessionManager#cacheManager 
  33.             sessionManager#cacheManager 
  34.             sessionManager#sessionValidationScheduler 
  35.             securityManager#rememberMeManager 
  36.   
  37.              
  38.             entityManagerFactory#jpaPropertyMap#hibernate.default_batch_fetch_size" 
  39.             entityManagerFactory#jpaPropertyMap#hibernate.max_fetch_depth" 
  40.             entityManagerFactory#jpaPropertyMap#hibernate.generate_statistics 
  41.             entityManagerFactory#jpaPropertyMap#hibernate.bytecode.use_reflection_optimizer 
  42.             entityManagerFactory#jpaPropertyMap#hibernate.cache.use_second_level_cache=false 
  43.             entityManagerFactory#jpaPropertyMap#hibernate.cache.use_query_cache 
  44.             entityManagerFactory#jpaPropertyMap#hibernate.cache.region.factory_class 
  45.             entityManagerFactory#jpaPropertyMap#hibernate.cache.use_structured_entries 
  46.             entityManagerFactory#jpaPropertyMap#net.sf.ehcache.configurationResourceName 
  47.          
  48.      
  49.   
  50.      
  51.      
  52.          
  53.              com\.sishuok\.es\.showcase.* 
  54.              com\.sishuok\.es\.monitor.* 
  55.              com\.sishuok\.es\.extra\.aop.* 
  56.              com\.sishuok\.es\.extra\.quartz.* 
  57.              com\.sishuok\.es\.conf.* 
  58.               
  59.               
  60.          
  61.      
  62.   
  63.      
  64.      
  65.          
  66.             domainClassConverter 
  67.          
  68.      
  69.  
  1. 默認所有bean lazy-init;
  2. removedClassPatterns:正則表達式,即可以移除的bean的class路徑模式,bean class匹配該模式的將移除;此處需要良好的分包,否則不好應用;
  3. removedBeanNames:即在調(diào)試期間可以移除的bean;
  4. removeOrReplaceBeanProperties:調(diào)試期間可以刪除/替換掉的bean屬性;如移除shiro的sessionManager的cacheManager;如禁用hibernate二級緩存:entityManagerFactory#jpaPropertyMap#hibernate.cache.use_second_level_cache=false 
  5. noneLazyBeanNames:有些bean不能lazy-init;排除掉。

具體實現(xiàn)請參考:

可以直接下載使用。

SpeedUpSpringProcessor:

https://github.com/zhangkaitao/es/blob/master/common/src/main/java/com/sishuok/es/common/spring/SpeedUpSpringProcessor.java

spring-speed-up.xml:

https://github.com/zhangkaitao/es/blob/master/web/src/main/resources/spring-speed-up.xml

其他提到的配置文件都在:

https://github.com/zhangkaitao/es/tree/master/web/src/main/resources

開啟/關閉:

此處我使用了spring的profile:

 
 
 
  1.  

即只有當System.getProperties中有spring.profiles.active=developement才執(zhí)行調(diào)試模式,所以如果沒有該配置還是走的正常流程,對系統(tǒng)沒有影響,所以此處大家可以使用:

1、jetty內(nèi)嵌執(zhí)行時設置該屬性

 
 
 
  1.  
  2.     org.mortbay.jetty 
  3.     jetty-maven-plugin 
  4.     ${jetty.version} 
  5.      
  6.         ---省略 
  7.          
  8.          
  9.              
  10.                 spring.profiles.active 
  11.                 development 
  12.              
  13.          
  14.      
  15.  

2、寫多個bat文件分別執(zhí)行不同的情況。


本文標題:加速Java應用開發(fā)1—Spring調(diào)試啟動速度
文章路徑:http://www.dlmjj.cn/article/dhocjps.html