加速Java应用开发速度1——加速spring/hibernate应用调试时启动速度

在调试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:

Xml代码  

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

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

还有,如springmvc 扫描:

Xml代码  

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

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

还有如事务的扫描:

Xml代码  

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

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

Xml代码  

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

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

2、延迟加载你的bean

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

Xml代码  

  1. default-lazy-init="true"

2.1、这种方式可能对如任务调度等没有依赖的情况造成影响;

2.2、在正式机环境还是非lazy bean的好,这样可以在启动时发现一些可能存在的问题;

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

因此我写了个工具:SpeedUpSpringProcessor,其作用是:在调试时lazy-init所有bean;具体配置请参考最后。

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一样,写比较精确的实体扫描路径

Xml代码  

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

2、generateDdl=false 禁用掉

没必要每次都生成ddl

3、 禁用JSR-303验证

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

Xml代码  

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

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

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

Xml代码  

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

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

Xml代码  

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

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

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

之前提到的SpeedUpSpringProcessor配置

Xml代码  

  1. <!-- 优化spring启动 通过移除bean定义 和 lazy init 实现 -->
  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. <!-- spring-config-shiro.xml -->
  13. <value>rememberMeCookie</value>
  14. <value>rememberMeManager</value>
  15. <value>shiroCacheManager</value>
  16. <value>sessionValidationScheduler</value>
  17. <value>sessionValidationScheduler</value>
  18. <!-- spring-mvc.xml -->
  19. <value>multipartResolver</value>
  20. <!-- spring-config-monitor.xml -->
  21. <value>druidStatInterceptor</value>
  22. <value>druidAdvisor</value>
  23. </list>
  24. </property>
  25. <!-- 需要从bean定义中移除的bean的属性 -->
  26. <!--替换掉的属性值 see removedBeanProperties 只支持简单属性-->
  27. <property name="removeOrReplaceBeanProperties">
  28. <list>
  29. <!-- spring-config-shiro.xml -->
  30. <value>sessionManager#cacheManager</value>
  31. <value>sessionManager#cacheManager</value>
  32. <value>sessionManager#sessionValidationScheduler</value>
  33. <value>securityManager#rememberMeManager</value>
  34. <!-- spring-config.xml -->
  35. <value>entityManagerFactory#jpaPropertyMap#hibernate.default_batch_fetch_size"</value>
  36. <value>entityManagerFactory#jpaPropertyMap#hibernate.max_fetch_depth"</value>
  37. <value>entityManagerFactory#jpaPropertyMap#hibernate.generate_statistics</value>
  38. <value>entityManagerFactory#jpaPropertyMap#hibernate.bytecode.use_reflection_optimizer</value>
  39. <value>entityManagerFactory#jpaPropertyMap#hibernate.cache.use_second_level_cache=false</value>
  40. <value>entityManagerFactory#jpaPropertyMap#hibernate.cache.use_query_cache</value>
  41. <value>entityManagerFactory#jpaPropertyMap#hibernate.cache.region.factory_class</value>
  42. <value>entityManagerFactory#jpaPropertyMap#hibernate.cache.use_structured_entries</value>
  43. <value>entityManagerFactory#jpaPropertyMap#net.sf.ehcache.configurationResourceName</value>
  44. </list>
  45. </property>
  46. <!-- 需要从bean定义中移除指定的类类型 正则表达式-->
  47. <property name="removedClassPatterns">
  48. <list>
  49. <value>com\.sishuok\.es\.showcase.*</value>
  50. <value>com\.sishuok\.es\.monitor.*</value>
  51. <value>com\.sishuok\.es\.extra\.aop.*</value>
  52. <value>com\.sishuok\.es\.extra\.quartz.*</value>
  53. <value>com\.sishuok\.es\.conf.*</value>
  54. <!--<value>com\.sishuok\.es\.personal.*\.web\.controller.*</value>-->
  55. <!--<value>com\.sishuok\.es\.sys.*\.web\.controller.*</value>-->
  56. </list>
  57. </property>
  58. <!-- 指定非延迟加载的bean-->
  59. <property name="noneLazyBeanNames">
  60. <list>
  61. <value>domainClassConverter</value>
  62. </list>
  63. </property>
  64. </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:

Java代码  

  1. <beans profile="development" >

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

1、jetty内嵌执行时设置该属性

Xml代码  

  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、写多个bat文件分别执行不同的情况。

加速Java应用开发速度1——加速spring/hibernate应用调试时启动速度

时间: 2024-10-20 00:12:53

加速Java应用开发速度1——加速spring/hibernate应用调试时启动速度的相关文章

加速Java应用开发速度2——加速项目调试启动速度

上一篇Spring/Hibernate提升速度的文章主要是通过一些技巧来提升启动速度,还是做不到如类的热部署/热替换.因此再写一篇关于热部署/热替换的文章.之前也有很多人介绍过这些知识,不过比较分散,我写此篇的目的是聚合它们.本文以HotSpot虚拟机为例. 首先让我们来看两个概念:热部署.热替换 热部署 即在容器运行过程中,重新加载类或重新加载整个项目.常见的解决方案就是使用自定义ClassLoader: 部分加载的示例:如JSP.Play框架: 重新加载整个项目的示例:如Tomcat.Jet

加速Java应用开发速度3——单元/集成测试+CI

大家可能对如下情景比较熟悉: 如果开发过SSH的web项目,启动服务器可能会比较慢,有的项目甚至需要1分多钟,甚至更多,这个启动时间的等待一般就浪费了: 在开发项目时,有些功能比较复杂,当时觉得思路特清晰,但是过了一段时间后,自己也忘了,完善功能时频繁出现bug,降低开发速度: 在维护项目时,不知道自己修改的对还是不对,是否存在隐患:维护速度降下来了: 如果开发一个很多人都使用的接口,典型的如用户系统,要保证比如升级时向下兼容: 在团队间协作时,有时候只定义好接口,对方还没有给实现,如何进行同步

java web开发入门四(spring)基于intellig idea

spring 1.spring简介 Spring框架,可以解决对象创建以及对象之间依赖关系的一种框架. 且可以和其他框架一起使用:Spring与Struts,  Spring与hibernate (起到整合(粘合)作用的一个框架) Spring提供了一站式解决方案: 1) Spring Core  spring的核心功能: IOC容器, 解决对象创建及依赖关系 2) Spring Web  Spring对web模块的支持. -à 可以与struts整合,让struts的action创建交给spr

java web开发入门六(spring mvc)基于intellig idea

spring mvc ssm=spring mvc+spring +mybatis spring mvc工作流程 1A)客户端发出http请求,只要请求形式符合web.xml文件中配置的*.action的话,就由DispatcherServlet来处理. 1B)DispatcherServlet再将http请求委托给映射器的对象来将http请求交给对应的Action来处理 2)映射器根据客户的http请求,再对比<bean name="/hello.action如果匹配正确,再将http请

匀加速商城系统开发模式底层框架搭建

.net框架下的B/S软件开发被广泛应用的原因在于此技术为轻量级,能够跨系统进行操作,能够捕捉动态数据及绚丽的UI设计等软件开发模式,拥有高效率的开发,容易上手.当然,也存在对服务端硬件要求较高的弊端,但不可否认的是,.net框架下B/S软件开发技术能够进一步推动世界科技的向前发展.  1 .net框架下B/S技术  1.1 WebForm  WebForm是一套完善的组建开发技术,其原理是结合用户所需的URL,找到与之相应的aspx和aspx.cs:然后将html标签和服务端标签runat=s

Spring Hibernate JPA 联表查询 复杂查询

(转自:http://www.cnblogs.com/jiangxiaoyaoblog/p/5635152.html) 今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的? 是.如果hibernate认为jpa的注解够用,就直接用.否则会弄一个自己的出来作为补充. 2)jpa和hibernate都提供了Entity,我们应该用哪个,还是说可以两个一起用? Hibernate的Entity是继承了jpa的,所以如果觉得jpa的不够用,直接使用hibernate的即可

使用Spring Boot来加速Java web项目的开发

使用Spring Boot来加速Java web项目的开发 我想,现在企业级的Java web项目应该或多或少都会使用到Spring框架的. 回首我们以前使用Spring框架的时候,我们需要首先在(如果你使用Maven的话)pom文件中增加对相关的的依赖(使用gradle来构建的话基本也一样)然后新建Spring相关的xml文件,而且往往那些xml文件还不会少.然后继续使用tomcat或者jetty作为容器来运行这个工程.基本上每次创建一个新的项目都是这么一个流程,而我们有时候仅仅想快速的创建一

如何加速golang写业务的开发速度

如何加速golang写业务的开发速度 不要忌讳panic golang写业务代码经常会被吐槽,写业务太慢了,其中最大的吐槽点就是,处理各种error太麻烦了.一个项目中,会有30%或者更多的是在处理error. 对于golang的error这个事情,golang的官方也说的很详细,建议函数返回error,并且让上层调用处理. error和panic实际上就是以前写PHP业务的时候争论的使用errno还是exception的争论.实际上,后续在PHP世界里面,大家都倾向于会使用exception来

匀加速系统模式开发匀加速系统模式详解

匀加速系统开发(李想.185.6504.8478)物体运动过程中,其速度的变化量与发生这一变化所用时间的比值称为加速度(用a表示).若一物体沿直线运动,且在运动的过程中加速度保持不变,则称这一物体在做匀加速直线运动.它的加速度为某一个常值,当这个常值恒为零时就变为匀速直线运动或静止.可以说匀速直线运动是匀加速直线运动的特殊情况.但是在中学考试中,一般不把匀速直线运动当作匀加速直线运动.看来小编有必要给大伙们简介一下匀加速系统的大致内容. 一.匀加速系统是什么? 匀加速采用"020+F2C+会员制