成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

加速Java應(yīng)用開發(fā)1—Spring調(diào)試啟動(dòng)速度

開發(fā) 后端
在調(diào)試spring應(yīng)用時(shí),動(dòng)輒幾十秒,甚至有的應(yīng)用上分鐘的啟動(dòng)速度,會(huì)讓整個(gè)調(diào)試速度慢下來了。等待時(shí)間讓人抓狂。不知道大家是如何加速spring應(yīng)用調(diào)試速度的,在此分享下我的一次加速過程。歡迎補(bǔ)充指正。

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

環(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容器啟動(dòng)速度:

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

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

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

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

注意:此處只是spring容器啟動(dòng)速度,不包括服務(wù)器啟動(dòng)時(shí)的速度。因?yàn)槲业南到y(tǒng)好久沒清理了,否則可能速度會(huì)更快。

加速Spring

1、掃描注解Bean

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

  1. <context:component-scan base-package="com.sishuok.es.**.repository,com.sishuok.es.**.service,com.sishuok.es.**.extra"> 

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

還有,如springmvc 掃描:

  1. <context:component-scan base-package="com.sishuok.es.**.web.controller" use-default-filters="false"> 

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

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

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

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

  1. <jpa:repositories 
  2.             base-package="com.sishuok.es.**.repository" 

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

2、延遲加載你的bean

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

  1. default-lazy-init="true" 

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

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

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

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

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

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

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

常見的可以移除的如:

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

4、刪除無用屬性

如在測試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

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

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

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

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

加速Hibernate/JPA

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

1、 精確化packagesToScan

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

  1. <property name="packagesToScan" value="com.sishuok.es.**.entity"/> 

2、generateDdl=false 禁用掉

沒必要每次都生成ddl

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

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

  1. <!-- 使用自定義的validator進(jìn)行jsr303驗(yàn)證 --> 
  2. <entry key="javax.persistence.validation.factory" value-ref="validator"/> 
  3. <!-- jsr303驗(yàn)證模式 因?yàn)槠湟打?yàn)證 要么不驗(yàn)證 不能按照規(guī)則走 所以此處禁用 --> 
  4. <!-- #http://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html/configuration.html --> 
  5. <entry key="javax.persistence.validation.mode" value="NONE"/> 

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

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

  1. <entry key="hibernate.archive.autodetection" value="class"/> 

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

  1. <entry key="hibernate.query.startup_check" value="false"/> 

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

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

之前提到的SpeedUpSpringProcessor配置

  1. <!-- 優(yōu)化spring啟動(dòng) 通過移除bean定義 和 lazy init 實(shí)現(xiàn) --> 
  2. <bean class="com.sishuok.es.common.spring.SpeedUpSpringProcessor"> 
  3.     <!-- 需要從bean定義中移除的bean的名字 --> 
  4.     <property name="removedBeanNames"> 
  5.         <list> 
  6.             <!-- spring-config-quartz.xml --> 
  7.             <value>scheduler</value> 
  8.             <value>autoClearDeletedRelationTrigger</value> 
  9.             <value>autoClearExpiredOrDeletedmMessageTrigger</value> 
  10.             <value>autoClearDeletedRelationJob</value> 
  11.             <value>autoClearExpiredOrDeletedmMessageJob</value> 
  12.   
  13.             <!-- spring-config-shiro.xml --> 
  14.             <value>rememberMeCookie</value> 
  15.             <value>rememberMeManager</value> 
  16.             <value>shiroCacheManager</value> 
  17.             <value>sessionValidationScheduler</value> 
  18.             <value>sessionValidationScheduler</value> 
  19.             <!-- spring-mvc.xml --> 
  20.             <value>multipartResolver</value> 
  21.   
  22.             <!-- spring-config-monitor.xml --> 
  23.             <value>druidStatInterceptor</value> 
  24.             <value>druidAdvisor</value> 
  25.         </list> 
  26.     </property> 
  27.     <!-- 需要從bean定義中移除的bean的屬性 --> 
  28.     <!--替換掉的屬性值 see removedBeanProperties 只支持簡單屬性--> 
  29.     <property name="removeOrReplaceBeanProperties"> 
  30.         <list> 
  31.             <!-- spring-config-shiro.xml --> 
  32.             <value>sessionManager#cacheManager</value> 
  33.             <value>sessionManager#cacheManager</value> 
  34.             <value>sessionManager#sessionValidationScheduler</value> 
  35.             <value>securityManager#rememberMeManager</value> 
  36.   
  37.             <!-- spring-config.xml --> 
  38.             <value>entityManagerFactory#jpaPropertyMap#hibernate.default_batch_fetch_size"</value> 
  39.             <value>entityManagerFactory#jpaPropertyMap#hibernate.max_fetch_depth"</value> 
  40.             <value>entityManagerFactory#jpaPropertyMap#hibernate.generate_statistics</value> 
  41.             <value>entityManagerFactory#jpaPropertyMap#hibernate.bytecode.use_reflection_optimizer</value> 
  42.             <value>entityManagerFactory#jpaPropertyMap#hibernate.cache.use_second_level_cache=false</value> 
  43.             <value>entityManagerFactory#jpaPropertyMap#hibernate.cache.use_query_cache</value> 
  44.             <value>entityManagerFactory#jpaPropertyMap#hibernate.cache.region.factory_class</value> 
  45.             <value>entityManagerFactory#jpaPropertyMap#hibernate.cache.use_structured_entries</value> 
  46.             <value>entityManagerFactory#jpaPropertyMap#net.sf.ehcache.configurationResourceName</value> 
  47.         </list> 
  48.     </property> 
  49.   
  50.     <!-- 需要從bean定義中移除指定的類類型 正則表達(dá)式--> 
  51.     <property name="removedClassPatterns"> 
  52.         <list> 
  53.              <value>com\.sishuok\.es\.showcase.*</value> 
  54.              <value>com\.sishuok\.es\.monitor.*</value> 
  55.              <value>com\.sishuok\.es\.extra\.aop.*</value> 
  56.              <value>com\.sishuok\.es\.extra\.quartz.*</value> 
  57.              <value>com\.sishuok\.es\.conf.*</value> 
  58.              <!--<value>com\.sishuok\.es\.personal.*\.web\.controller.*</value>--> 
  59.              <!--<value>com\.sishuok\.es\.sys.*\.web\.controller.*</value>--> 
  60.         </list> 
  61.     </property> 
  62.   
  63.     <!-- 指定非延遲加載的bean--> 
  64.     <property name="noneLazyBeanNames"> 
  65.         <list> 
  66.             <value>domainClassConverter</value> 
  67.         </list> 
  68.     </property> 
  69. </bean> 
  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

開啟/關(guān)閉:

此處我使用了spring的profile:

  1. <beans profile="development" > 

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

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

  1. <plugin> 
  2.     <groupId>org.mortbay.jetty</groupId> 
  3.     <artifactId>jetty-maven-plugin</artifactId> 
  4.     <version>${jetty.version}</version> 
  5.     <configuration> 
  6.         ---省略 
  7.         <!-- spring profile  --> 
  8.         <systemProperties> 
  9.             <systemProperty> 
  10.                 <name>spring.profiles.active</name> 
  11.                 <value>development</value> 
  12.             </systemProperty> 
  13.         </systemProperties> 
  14.     </configuration> 
  15. </plugin> 

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

原文鏈接:http://jinnianshilongnian.iteye.com/blog/1883013

 

責(zé)任編輯:陳四芳 來源: 開濤的博客
相關(guān)推薦

2013-07-03 09:52:13

熱部署熱替換

2013-07-04 13:19:24

Java開發(fā)速度

2021-08-17 10:31:57

Java JakartaEE Spring

2022-11-09 07:49:12

Records類聲明代碼

2012-02-08 15:06:31

ibmdw

2013-07-03 10:20:06

2023-12-06 08:30:02

Spring項(xiàng)目

2009-09-24 17:21:17

加速Hibernate

2018-05-25 16:32:45

Spring BootJava開發(fā)

2016-10-14 14:16:28

Spring BootJava應(yīng)用

2010-05-05 17:19:55

云計(jì)算

2017-06-14 09:00:40

容器開發(fā)人員云應(yīng)用

2018-09-11 09:00:50

工具開發(fā)應(yīng)用程序

2011-08-15 17:38:48

iPhone開發(fā)調(diào)試工具

2022-09-01 09:35:13

java應(yīng)用工具

2024-12-03 11:12:47

2013-07-04 13:37:23

Java開發(fā)速度

2024-06-20 09:00:31

2018-05-31 15:30:11

JavaSpring Boot應(yīng)用開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 精品蜜桃一区二区三区 | 免费看欧美一级片 | 波多野结衣一区二区三区 | 国产高清精品一区二区三区 | 成人精品区 | 人人做人人澡人人爽欧美 | 欧洲av一区| 欧美成人精品激情在线观看 | 国产精品久久久久久久免费大片 | 最新91在线 | 欧美精品日韩精品 | 色av一区二区三区 | a级黄色毛片免费播放视频 国产精品视频在线观看 | 精品三区 | 99九九视频 | 色综合视频在线 | 免费观看的黄色网址 | 91av视频在线观看 | 一级毛片网 | 日韩一区二区三区在线播放 | 免费美女网站 | 国产精品久久精品 | 成人影院网站ww555久久精品 | 欧美精品一区在线 | 99在线资源| www亚洲精品 | 久久se精品一区精品二区 | 国产精品99 | 欧美成人一区二区三区 | 男人天堂网av | 成人av一区二区三区 | www九色 | 中文字幕久久久 | 久久久精品国产 | 一区二区三区在线电影 | 亚洲免费精品 | 午夜免费福利电影 | 午夜午夜精品一区二区三区文 | 亚洲 日本 欧美 中文幕 | 日韩欧美一级精品久久 | 久久久久久国产免费视网址 |