關於spring啓動的優化的問題

  jspark 的這篇文章《開發階段eclipse下面的spring容器的啓動優化 》講到如何加快spring的啓動速度。非常感謝jspark. 一下是引用的原文:

  最近在負責一個大項目,項目組成員包括項目經理大概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分鐘倒不是大問題。

我這裏要提醒的是不是說有的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 >


 

62740.html

莫多 2006-08-10 10:59 發表評論
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章