iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Spring如何进行调试启动速度
  • 466
分享到

Spring如何进行调试启动速度

2023-06-17 08:06:06 466人浏览 独家记忆
摘要

这篇文章给大家介绍spring如何进行调试启动速度,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在调试spring应用时,动辄几十秒,甚至有的应用上分钟的启动速度,会让整个调试速度慢下来了。等待时间让人抓狂。环境配置:

这篇文章给大家介绍spring如何进行调试启动速度,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

在调试spring应用时,动辄几十秒,甚至有的应用上分钟的启动速度,会让整个调试速度慢下来了。等待时间让人抓狂。

环境

配置:

thinkpad t410 内存:4G内存 CPU:Intel P8700 双核2.53GHZ 系统:WIN XP 开发工具:Intellij idea 12.0.4 Maven + spring3.2.3 + hibernate4.2.2+Spring data jpa 1.3.1

未优化前spring容器启动速度:

16890毫秒 =(14609毫秒(ContextLoaderListener加载的)+2281毫秒(springMVC加载的)

优化后spring容器启动速度:

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

速度提升了一半多,而且以后在调试阶段,大部分就停留在这个时间左右。

注意:此处只是spring容器启动速度,不包括服务器启动时的速度。因为我的系统好久没清理了,否则可能速度会更快。

加速Spring

1、扫描注解Bean

写比较精确的扫描路径,如扫描@Service和@Repository:

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

这样写,比直接写com.sishuok.es速度要快很多,因为这样扫描的class会很少。

还有,如springmvc 扫描:

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

此处只扫描项目的web.controller包,这样扫描的class也很少。

还有如事务的扫描:

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

还有如使用spring data jpa时也是这样:

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

这里需要大家有良好的分包,否则无法优化

2、延迟加载你的bean

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

default-lazy-init="true"

1、这种方式只对xml声明的bean有效;

2、注解扫描的bean无效,如@Service,需要使用@Lazy指定,但这样太麻烦,需要一个一个的配置;

3、还有就是如果你使用springmvc,lazy-init几乎没啥用,因为springmvc容器在启动时会通过  DefaultAnnotationHandlerMapping查找相关的带有@RequestMapping的bean并注册请求映射;所以相关的如  Service/Repository也级联非lazy-init;

因此我写了个工具:SpeedUpSpringProcessor,其作用是:lazy-init所有bean,包括注解的bean;对于【2.3】后续介绍解决方案;具体配置请参考***。

3、移除调试阶段不相干的bean

有些bean在调试阶段我们并不需要,如我们在测试用户模块时,可能不需要测试权限模块;此时我们可以把不相干的bean移除掉;具体配置请参考***。

这样的话,可以考虑如把@Controller的bean移除,这样的话如Service/Repository就可以lazy-init了。

常见的可以移除的如:

  • 任务调度器(quartz)、aop相关等等;

  • 此处需要合理的分包,否则无法应用或应用困难。

4、删除无用属性

如在测试shiro时,可能不需要remember的功能,此时可以把属性移除/禁用(即将值设置为false);具体配置请参考***。

5、替换正式机数据源为最快的数据源

如此处我把DruidDataSource数据源直接替换为org.springframework.jdbc.datasource.DriverManagerDataSource,这个速度最快;

6、替换jackson为fastjson

此处测试了下jackson速度比fastJSON慢许多的。支持国产。

7、项目分模块开发 

如果项目模块比较多,可以考虑放弃注解,而使用xml配置方式+约定。因为实际做项目时可能把配置分到多个配置文件,此时我尝试了下合并到一个,几乎没啥速度提升,所以还是分开存好。

到此spring容器启动速度算是比较快了,不知道大家还有没有好的策略。欢迎指点。

加速Hibernate/JPA

此处以org.springframework.ORM.jpa.LocalContainerEntityManagerFactoryBean为例。

1、 精确化packagesToScan

和之前的spring一样,写比较精确的实体扫描路径

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

2、generateDdl=false 禁用掉

没必要每次都生成ddl

3、 禁用JSR-303验证

默认情况下是AUTO,会根据classpath下是否有jsr-303实现来自动注册;

<!-- 使用自定义的validator进行jsr303验证 --> <entry key="javax.persistence.validation.factory" value-ref="validator"/> <!-- jsr303验证模式 因为其要么验证 要么不验证 不能按照规则走 所以此处禁用 --> <!-- #Http://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html/configuration.html --> <entry key="javax.persistence.validation.mode" value="NONE"/>

此处validator 直接引用我们项目中定义的,而不是让hibernate再去new一个。而且也不推荐在这验证,具体为什么,请参考我的《我是这样认识注解和XML的》。

4、如果你的项目都是注解,此时就没必要扫描hbm了,禁用掉

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

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

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

6、在调试阶段禁用掉二级缓存

通过如上手段,我的spring容器启动速度提升了一半多。大家还有好的优化策略吗?如果有欢迎补充。具体配置请参考***。

之前提到的SpeedUpSpringProcessor配置

<!-- 优化spring启动 通过移除bean定义 和 lazy init 实现 --> <bean class="com.sishuok.es.common.spring.SpeedUpSpringProcessor">     <!-- 需要从bean定义中移除的bean的名字 -->     <property name="removedBeanNames">         <list>             <!-- spring-config-quartz.xml -->             <value>scheduler</value>             <value>autoClearDeletedRelationTrigger</value>             <value>autoClearExpiredOrDeletedmMessageTrigger</value>             <value>autoClearDeletedRelationJob</value>             <value>autoClearExpiredOrDeletedmMessageJob</value>               <!-- spring-config-shiro.xml -->             <value>rememberMeCookie</value>             <value>rememberMeManager</value>             <value>shiroCacheManager</value>             <value>sessionValidationScheduler</value>             <value>sessionValidationScheduler</value>             <!-- spring-mvc.xml -->             <value>multipartResolver</value>               <!-- spring-config-monitor.xml -->             <value>druidStatInterceptor</value>             <value>druidAdvisor</value>         </list>     </property>     <!-- 需要从bean定义中移除的bean的属性 -->     <!--替换掉的属性值 see removedBeanProperties 只支持简单属性-->     <property name="removeOrReplaceBeanProperties">         <list>             <!-- spring-config-shiro.xml -->             <value>sessionManager#cacheManager</value>             <value>sessionManager#cacheManager</value>             <value>sessionManager#sessionValidationScheduler</value>             <value>securityManager#rememberMeManager</value>               <!-- spring-config.xml -->             <value>entityManagerFactory#jpaPropertyMap#hibernate.default_batch_fetch_size"</value>             <value>entityManagerFactory#jpaPropertyMap#hibernate.max_fetch_depth"</value>             <value>entityManagerFactory#jpaPropertyMap#hibernate.generate_statistics</value>             <value>entityManagerFactory#jpaPropertyMap#hibernate.bytecode.use_reflection_optimizer</value>             <value>entityManagerFactory#jpaPropertyMap#hibernate.cache.use_second_level_cache=false</value>             <value>entityManagerFactory#jpaPropertyMap#hibernate.cache.use_query_cache</value>             <value>entityManagerFactory#jpaPropertyMap#hibernate.cache.region.factory_class</value>             <value>entityManagerFactory#jpaPropertyMap#hibernate.cache.use_structured_entries</value>             <value>entityManagerFactory#jpaPropertyMap#net.sf.ehcache.configurationResourceName</value>         </list>     </property>       <!-- 需要从bean定义中移除指定的类类型 正则表达式-->     <property name="removedClassPatterns">         <list>              <value>com\.sishuok\.es\.showcase.*</value>              <value>com\.sishuok\.es\.monitor.*</value>              <value>com\.sishuok\.es\.extra\.aop.*</value>              <value>com\.sishuok\.es\.extra\.quartz.*</value>              <value>com\.sishuok\.es\.conf.*</value>              <!--<value>com\.sishuok\.es\.personal.*\.web\.controller.*</value>-->              <!--<value>com\.sishuok\.es\.sys.*\.web\.controller.*</value>-->         </list>     </property>       <!-- 指定非延迟加载的bean-->     <property name="noneLazyBeanNames">         <list>             <value>domainClassConverter</value>         </list>     </property> </bean>
  1. 默认所有bean lazy-init;

  2. removedClassPatterns:正则表达式,即可以移除的bean的class路径模式,bean class匹配该模式的将移除;此处需要良好的分包,否则不好应用;

  3. removedBeanNames:即在调试期间可以移除的bean;

  4. removeOrReplaceBeanProperties:调试期间可以删除/替换掉的bean属性;如移除shiro的sessionManager的cacheManager;如禁用hibernate二级缓存:entityManagerFactory#jpaPropertyMap#hibernate.cache.use_second_level_cache=false 

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

具体实现请参考:

可以直接下载使用。

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:

<beans profile="development" >

即只有当System.getProperties中有spring.profiles.active=developement才执行调试模式,所以如果没有该配置还是走的正常流程,对系统没有影响,所以此处大家可以使用:

jetty内嵌执行时设置该属性

<plugin>     <groupId>org.mortbay.jetty</groupId>     <artifactId>jetty-maven-plugin</artifactId>     <version>${jetty.version}</version>     <configuration>         ---省略         <!-- spring profile  -->         <systemProperties>             <systemProperty>                 <name>spring.profiles.active</name>                 <value>development</value>             </systemProperty>         </systemProperties>     </configuration> </plugin>

写多个bat文件分别执行不同的情况。

关于Spring如何进行调试启动速度就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Spring如何进行调试启动速度

本文链接: https://www.lsjlt.com/news/287955.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring如何进行调试启动速度
    这篇文章给大家介绍Spring如何进行调试启动速度,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在调试spring应用时,动辄几十秒,甚至有的应用上分钟的启动速度,会让整个调试速度慢下来了。等待时间让人抓狂。环境配置:...
    99+
    2023-06-17
  • Spring如何使用@Indexed加快启动速度
    目录使用@Indexed加快启动速度Spring5--@Indexed注解举个栗子使用@Indexed加快启动速度 Spring读取@Component组件(派生性),有两种实现方式...
    99+
    2024-04-02
  • 如何对服务器进行速度的测试
    对服务器进行速度测试的方法:1、在服务器后台终端命令窗口中使用tracert命令进行测试;2、在服务器中打开DOS命令窗口,使用ping命令进行测试;3、使用GTmetrixgtmetrix网站速度测试工具对服务器进行网站速度测试;4、利用...
    99+
    2024-04-02
  • 如何去进行css调试
    今天就跟大家聊聊有关如何去进行css调试,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。css关系到界面的美观,有时候功能实现了。界面确丑到没人用,终...
    99+
    2024-04-02
  • NetBeans如何提升启动速度
    这篇文章将为大家详细讲解有关NetBeans如何提升启动速度,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。NetBeans优化的目的是提高NetBeans的启动速度和运行速度。下面介绍的NetBeans优...
    99+
    2023-06-17
  • Android如何优化启动速度
    这篇文章给大家分享的是有关Android如何优化启动速度的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。启动方式应用有三种启动状态,每种状态都会影响应用向用户显示所需的时间:冷启动、温启动与热启动冷启动(启动优化目...
    99+
    2023-06-25
  • 如何在 Python 中使用 Django Shell 进行快速调试?
    Django 是一个高效的 Python Web 开发框架,它提供了许多有用的工具和库,使得 Web 开发变得更加容易和快捷。其中一个非常有用的工具就是 Django Shell。Django Shell 是一个交互式 Python sh...
    99+
    2023-07-26
    http django shell
  • 如何进行CentOS yum镜像速度测试记录文件
    这期内容当中小编将会给大家带来有关如何进行CentOS yum镜像速度测试记录文件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。CentOS yum安装方式在有网络环境的时候非常方便,选择一个比较快的Ce...
    99+
    2023-06-16
  • 如何进行Suse启动xdmcp
    如何进行Suse启动xdmcp,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Suse经过长时间的发展,很多用户都很了解Suse了,这里我发表一下个人理解,主要说的是用Sus...
    99+
    2023-06-17
  • 如何使用Spring AOP进行测试
    本篇内容主要讲解“如何使用Spring AOP进行测试”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用Spring AOP进行测试”吧!AOP解析今天来介...
    99+
    2024-04-02
  • Windows XP系统中如何启动速度加速
    这篇文章将为大家详细讲解有关Windows XP系统中如何启动速度加速,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。随着Windows系统的身躯越来越庞大,到了Windows XP中,微软提...
    99+
    2023-06-14
  • 如何进行C++代码的调试?
    如何进行C++代码的调试引言:在编写C++代码时,难免会遇到各种Bug和错误。调试是程序开发中非常重要的一部分,因为它可以帮助我们找到问题所在并修复它们。本文将介绍一些常用的C++代码调试技巧和工具,帮助读者更好地进行C++代码调试。一、使...
    99+
    2023-11-02
    调试 C++ 代码编程
  • Torch中如何进行模型调试
    在 Torch 中进行模型调试通常需要使用一些工具和技巧来帮助识别和解决问题。以下是一些常用的方法: 使用 print() 函数...
    99+
    2024-04-02
  • win10系统启动速度如何优化
    要优化Win10系统的启动速度,你可以尝试以下几个方法: 清理开机启动项:打开任务管理器(按Ctrl+Shift+Esc),切换...
    99+
    2023-10-20
    win10
  • 加快Wind7系统的启动速度、运行速度的方法
    如何才能加快Windows7速度谁都希望自己的电脑速度变快,不论是开机速度还是软件的运行速度,在硬件不成为瓶颈之后,我们的确可以通过软件的手段来给系统提速。近来网上盛传关闭系统服务能加快Windows 7系统的启动速度、...
    99+
    2023-06-02
    Win7速度 启动速度 运行速度 启动 运行 速度 Wind7 系统
  • 如何进行小程序的测试与调试
    小程序的测试与调试可以通过以下几个步骤来进行: 使用开发者工具:小程序开发者工具是一个专门用于小程序开发和调试的工具,可以在其中...
    99+
    2024-04-17
    小程序
  • 如何使用Vconsole和Fillder进行移动端抓包调试
    这篇文章主要为大家展示了“如何使用Vconsole和Fillder进行移动端抓包调试”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用Vconsole和Fi...
    99+
    2024-04-02
  • 如何进行linux内核模块调试
    这篇文章将为大家详细讲解有关如何进行linux内核模块调试,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 开启虚拟机,虚拟机运行到 kgdb: Waiting for connection ...
    99+
    2023-06-16
  • 如何进行RK3288 HDMI配置和调试
    这篇文章给大家介绍如何进行RK3288 HDMI配置和调试,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。RK3288 最大输出分辨率为 3840x2160HDMI 驱动代码位于 kernel/dri...
    99+
    2023-06-05
  • 如何配置webpack+vue+express热启动调试
    这篇文章主要介绍了如何配置webpack+vue+express热启动调试,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。工具及目录所用的到的...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作