真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Spring如何進(jìn)行調(diào)試啟動(dòng)速度

這篇文章給大家介紹Spring如何進(jìn)行調(diào)試啟動(dòng)速度,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專(zhuān)注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、成都微信小程序、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了包河免費(fèi)建站歡迎大家使用!

在調(diào)試spring應(yīng)用時(shí),動(dòng)輒幾十秒,甚至有的應(yīng)用上分鐘的啟動(dòng)速度,會(huì)讓整個(gè)調(diào)試速度慢下來(lái)了。等待時(shí)間讓人抓狂。

環(huán)境

配置:

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

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

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

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

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

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

注意:此處只是spring容器啟動(dòng)速度,不包括

這樣寫(xiě),比直接寫(xiě)com.sishuok.es速度要快很多,因?yàn)檫@樣掃描的class會(huì)很少。

還有,如springmvc 掃描:

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

還有如事務(wù)的掃描:

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

還有如使用spring data jpa時(shí)也是這樣:

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

2、延遲加載你的bean

常見(jiàn)的方式是在配置文件中在上加:

default-lazy-init="true"

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

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

2.3、還有就是如果你使用springmvc,lazy-init幾乎沒(méi)啥用,因?yàn)閟pringmvc容器在啟動(dòng)時(shí)會(huì)通過(guò)  DefaultAnnotationHandlerMapping查找相關(guān)的帶有@RequestMapping的bean并注冊(cè)請(qǐng)求映射;所以相關(guān)的如  Service/Repository也級(jí)聯(lián)非lazy-init;

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

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

有些bean在調(diào)試階段我們并不需要,如我們?cè)跍y(cè)試用戶模塊時(shí),可能不需要測(cè)試權(quán)限模塊;此時(shí)我們可以把不相干的bean移除掉;具體配置請(qǐng)參考***。

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

常見(jiàn)的可以移除的如:

  • 任務(wù)調(diào)度器(quartz)、AOP相關(guān)等等;

  • 此處需要合理的分包,否則無(wú)法應(yīng)用或應(yīng)用困難。

4、刪除無(wú)用屬性

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

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

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

6、替換jackson為fastjson

此處測(cè)試了下jackson速度比f(wàn)astjson慢許多的。支持國(guó)產(chǎn)。

7、項(xiàng)目分模塊開(kāi)發(fā) 

如果項(xiàng)目模塊比較多,可以考慮放棄注解,而使用xml配置方式+約定。因?yàn)閷?shí)際做項(xiàng)目時(shí)可能把配置分到多個(gè)配置文件,此時(shí)我嘗試了下合并到一個(gè),幾乎沒(méi)啥速度提升,所以還是分開(kāi)存好。

到此spring容器啟動(dòng)速度算是比較快了,不知道大家還有沒(méi)有好的策略。歡迎指點(diǎn)。

加速Hibernate/JPA

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

1、 精確化packagesToScan

和之前的spring一樣,寫(xiě)比較精確的實(shí)體掃描路徑

2、generateDdl=false 禁用掉

沒(méi)必要每次都生成ddl

3、 禁用JSR-303驗(yàn)證

默認(rèn)情況下是AUTO,會(huì)根據(jù)classpath下是否有jsr-303實(shí)現(xiàn)來(lái)自動(dòng)注冊(cè);

    

此處validator 直接引用我們項(xiàng)目中定義的,而不是讓hibernate再去new一個(gè)。而且也不推薦在這驗(yàn)證,具體為什么,請(qǐng)參考我的《我是這樣認(rèn)識(shí)注解和XML的》。

4、如果你的項(xiàng)目都是注解,此時(shí)就沒(méi)必要掃描hbm了,禁用掉

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

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

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

之前提到的SpeedUpSpringProcessor配置

                                              scheduler             autoClearDeletedRelationTrigger             autoClearExpiredOrDeletedmMessageTrigger             autoClearDeletedRelationJob             autoClearExpiredOrDeletedmMessageJob                            rememberMeCookie             rememberMeManager             shiroCacheManager             sessionValidationScheduler             sessionValidationScheduler                          multipartResolver                            druidStatInterceptor             druidAdvisor                                                                sessionManager#cacheManager             sessionManager#cacheManager             sessionManager#sessionValidationScheduler             securityManager#rememberMeManager                            entityManagerFactory#jpaPropertyMap#hibernate.default_batch_fetch_size"             entityManagerFactory#jpaPropertyMap#hibernate.max_fetch_depth"             entityManagerFactory#jpaPropertyMap#hibernate.generate_statistics             entityManagerFactory#jpaPropertyMap#hibernate.bytecode.use_reflection_optimizer             entityManagerFactory#jpaPropertyMap#hibernate.cache.use_second_level_cache=false             entityManagerFactory#jpaPropertyMap#hibernate.cache.use_query_cache             entityManagerFactory#jpaPropertyMap#hibernate.cache.region.factory_class             entityManagerFactory#jpaPropertyMap#hibernate.cache.use_structured_entries             entityManagerFactory#jpaPropertyMap#net.sf.ehcache.configurationResourceName                                                 com\.sishuok\.es\.showcase.*              com\.sishuok\.es\.monitor.*              com\.sishuok\.es\.extra\.aop.*              com\.sishuok\.es\.extra\.quartz.*              com\.sishuok\.es\.conf.*                                                                            domainClassConverter               
  1. 默認(rèn)所有bean lazy-init;

  2. removedClassPatterns:正則表達(dá)式,即可以移除的bean的class路徑模式,bean class匹配該模式的將移除;此處需要良好的分包,否則不好應(yīng)用;

  3. removedBeanNames:即在調(diào)試期間可以移除的bean;

  4. removeOrReplaceBeanProperties:調(diào)試期間可以刪除/替換掉的bean屬性;如移除shiro的sessionManager的cacheManager;如禁用hibernate二級(jí)緩存:entityManagerFactory#jpaPropertyMap#hibernate.cache.use_second_level_cache=false 

  5. noneLazyBeanNames:有些bean不能lazy-init;排除掉。

具體實(shí)現(xiàn)請(qǐng)參考:

可以直接下載使用。

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

開(kāi)啟/關(guān)閉:

此處我使用了spring的profile:

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

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

     org.mortbay.jetty     jetty-maven-plugin     ${jetty.version}              ---省略                                                spring.profiles.active                 development                            

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

關(guān)于Spring如何進(jìn)行調(diào)試啟動(dòng)速度就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。


文章題目:Spring如何進(jìn)行調(diào)試啟動(dòng)速度
標(biāo)題來(lái)源:
http://weahome.cn/article/ihsdpj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部