`
爱像天空
  • 浏览: 204561 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

lazy-init属性和预实例化

    博客分类:
  • SSH
阅读更多
最近在负责一个大项目,项目组成员包括项目经理大概10个人左右。项目技术用struts+spring+hibernate实现。项目的规模相对来说是比较大的,总共有10大模块,每个大模块又分为有十几个、甚至几十个小模块。开发工具用eclipse,由于在开发阶段,项目开发成员需要频繁重启服务器。在启动服务器的时候,每次启动时间总是会超过1分钟。记得以前在做另外一个项目时,启动时间不到5秒钟,相差了10倍,而且项目规模是差不多的。

    从初步分析来说,应该是hibernate解释hbm.xml时花费时间,或者可能是spring容器启动并解释所有的bean配置文件。诊断了一下,发现1分钟消耗的时间主要分布在hibernate解释hbm.xml花费5秒;spring容器从启动到解释bean配置文件竟然花了58秒,真是太嚣张了。当时非常怀疑spring的效率问题。企图从网上搜索相关资料,看看有什么优化措施。

    首先是找到了hibernate的启动优化 http://www.hibernate.org/194.html 里面的主要思想是通过将xml序列花到本地的文件里,每次读取的时候根据情况,从本地文件读取并反序列化,节省了hibernate xml的解析时间。按照这个方式测试了一下,发现hibernate的启动时间从5秒降低到3秒,但是这个优化对于整个启动过程是杯水车薪的,毫无用处。

    没办法,又仔细查看了spring的资料,终于发现spring的容器是提供了lazy-load的,即默认的缺省设置是bean没有lazy- load,该属性处于false状态,这样导致spring在启动过程导致在启动时候,会默认加载整个对象实例图,从初始化ACTION配置、到 service配置到dao配置、乃至到数据库连接、事务等等。这么庞大的规模,难怪spring的启动时间要花将近1分钟。尝试了一下,把beans的 default-lazy-init改为true就,再次启动,速度从原来的55秒,降到8秒钟!!Great!虽然是非常小一个改动,但是影响确实非常大。一个项目组10个人,假若每个人一天平均需要在eclipse下启动测试服务器50次。那么一天项目组需要重启500次,每次节省50秒的话,就是 25000秒,将近几个小时,差不多一个工作日,多么可观的数字!

   不过在运行期间第一次点页面的时候,由于spring做了lazy-load,现在就需要启动一部分需要的beans,所以稍微慢2-3秒钟,但是明显比等几十秒要快很多,值得一鉴。

    以上是针对开发阶段的spring容器启动优化,在部署到实际环境中,倒是没必要设置为lazy-load。毕竟部署到实际环境中不是经常的事,每次启动1分钟倒不是大问题。


Java代码
  
我这里要提醒的是不是说有的beans都能设置default-lazy-init成为true.对于scheduler的bean不能用lazy-init   
  
  
  
< beans  default-lazy-init ="true" >   
       
      < bean  class ="org.springframework.scheduling.quartz.SchedulerFactoryBean" >   
          < property   name ="triggers" >   
              < list >   
                  < ref   bean ="buildHtmlTrigger" />   
                  < ref   bean ="askTrigger" />   
                  < ref   bean ="mailSenderTrigger" />   
                  < ref   bean ="topicDetailBuildTrigger" />   
                  < ref   bean ="forumBuildTrigger" />   
                  < ref   bean ="topicBuildTrigger" />   
              </ list >   
          </ property >   
      </ bean >   
</ beans >   
  
  
  
这样的话。所有的scheduler就都不管用了。所以请大家要注意。   
  
  
< beans >   
       
      < bean  class ="org.springframework.scheduling.quartz.SchedulerFactoryBean" >   
          < property   name ="triggers" >   
              < list >   
                  < ref   bean ="buildHtmlTrigger" />   
                  < ref   bean ="askTrigger" />   
                  < ref   bean ="mailSenderTrigger" />   
                  < ref   bean ="topicDetailBuildTrigger" />   
                  < ref   bean ="forumBuildTrigger" />   
                  < ref   bean ="topicBuildTrigger" />   
              </ list >   
          </ property >   
      </ bean >   
</ beans >   

分享到:
评论

相关推荐

    浅谈spring中的default-lazy-init参数和lazy-init

    在Spring框架中,有两个重要的参数default-lazy-init和lazy-init,它们都是用于控制Bean实例化的时机的。下面我们将详细介绍这两个参数的作用和区别。 一、default-lazy-init参数 default-lazy-init参数是Spring...

    Spring 延迟实例化

    在Spring中配置一个bean为延迟实例化非常简单,只需要在`&lt;bean&gt;`元素中添加`lazy-init`属性并设置其值为`true`即可。例如: ```xml &lt;bean id="lazyBean" class="com.example.LazyBean" lazy-init="true"&gt; &lt;!-- ...

    Swift-init构造函数

    同时,Swift支持延迟初始化(lazy initialization),这意味着某些属性可以在真正需要时才进行初始化,提高程序性能。 七、自定义结构体和枚举的初始化 结构体和枚举的初始化不同于类,它们不需要调用超类的初始化...

    spring1.2学习心得分享

    可以使用&lt;bean lazy-init=""/&gt;延缓实例化 可以使用&lt;beans default-lazy-init=""/&gt;延缓所有组件实例化 b.销毁时机:单例对象容器close()负责销毁 c.创建对象的模式(使用范围):scope控制,可以使用singleton和...

    spring学习心得

    可以使用&lt;bean lazy-init=""/&gt;延缓实例化 可以使用&lt;beans default-lazy-init=""/&gt;延缓所有组件实例化 b.销毁时机:单例对象容器close()负责销毁 c.创建对象的模式(使用范围):scope控制,可以使用singleton和...

    spring1.1开发理解

    可以使用&lt;bean lazy-init=""/&gt;延缓实例化 可以使用&lt;beans default-lazy-init=""/&gt;延缓所有组件实例化 b.销毁时机:单例对象容器close()负责销毁 c.创建对象的模式(使用范围):scope控制,可以使用singleton和...

    Python库 | lazy_object_proxy-1.4.2-cp37-cp37m-win_amd64.whl

    此外,它也可以用于构建复杂的依赖注入框架,或者优化那些需要大量实例化但使用频率不高的对象的代码。 总的来说,`lazy_object_proxy`库是Python开发者的一个强大工具,通过其惰性对象代理机制,可以在保证程序...

    Python库 | lazy_object_proxy-1.7.1-cp37-cp37m-win32.whl

    1. **减少初始化开销**:当对象初始化过程较为复杂或耗时,但并非每次运行都必须使用时,使用`lazy_object_proxy`可以节省资源。 2. **依赖注入**:在依赖对象不明确或需要在运行时动态决定时,可以通过惰性加载来...

    Spring配置使用之Bean生命周期详解

    init-method 和 destroy-method 属性是指在 Bean 实例化时执行的初始化操作和销毁操作。 定义 Bean public class Room { public Room(){ System.out.println("enter room..."); } public void turnOnLights(){...

    Spring ApplicationContext.xml配置的12个技巧演示教学.pdf

    lazy-init 可以用来延迟 Bean 的实例化,直到第一次使用该 Bean 时。这样可以提高应用程序的启动速度。 6. 使用 lookup-method 来注入 Bean lookup-method 可以用来注入 Bean,避免了硬编码的依赖关系。 7. 使用 ...

    spring.xls

    * lazy-init为“default/false”当启动spring容器的时候创建bean 但是如果该bean是prototype时,特殊。这种情况无效 * 在spring容器启动的时候,就会发现错误 * 有可能会造成一些数据长时间驻留在内存中 * lazy...

    spring bean 属性总结

    ### Spring Bean 属性详解 Spring框架是Java平台上的一个开源框架,主要用来简化企业级应用程序的开发。...通过深入了解这些元素和属性,开发人员可以更有效地利用Spring框架的功能,构建更加健壮和可扩展的应用程序。

    基于springioc bean 的几个属性介绍

    lazy-init 属性用于控制 Bean 对象的创建时机。其默认值为 false,这意味着在 Spring 容器启动时就会加载这些类。这么做的优点是可以及时发现 Bean 相关的错误,因为 Spring 容器启动,Bean 也都会创建完毕,如果 ...

    spring 配置文件简单说明

    Spring框架的配置文件是定义和管理Bean的核心工具,它允许我们声明Bean的实例化、依赖关系、生命周期行为等。在Spring中,`&lt;beans&gt;`和`&lt;bean&gt;`元素是两个非常重要的元素,它们分别用于定义整个配置上下文和单个Bean...

    spring-beans-3.0.xsd

    首先,`spring-beans-3.0.xsd`是Spring 3.0版本中的beans配置文件,它定义了一系列元素和属性,允许开发者声明、配置和管理bean。例如,`&lt;bean&gt;`元素是配置中最基础的部分,用于定义一个bean实例,包括其类名、初始...

    aop详细介绍

    但有时我们可能希望某些bean在真正需要时才被实例化,这时可以将`lazy-init`设为`true`,这样bean将在第一次通过`getBean`方法请求时才被创建。 AOP的配置通常分为两种方式:一种是基于XML的声明式配置,另一种是...

    浅谈spring容器中bean的初始化

    总的来说,Spring容器对Bean的初始化管理十分灵活,通过调整`scope`和`lazy-init`属性,我们可以控制Bean的创建策略,以适应不同场景的需求。同时,初始化回调机制允许我们实现定制化的初始化逻辑,增强了Bean的可...

    Sprig学习笔记—适用刚接触者

    Spring中的BeanFactory和ApplicationContext是IoC容器的代表,它们负责对象的实例化、定位和配置。 2. **依赖注入(DI)**:DI是IoC的一个具体实现,它允许容器在运行时动态地将依赖关系注入到对象中。Spring提供了...

Global site tag (gtag.js) - Google Analytics