關於spring啟動的優化

2021-08-29 05:56:44 字數 2951 閱讀 5127

**(

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的啟動優化

裡面的主要思想是通過將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.schedule***ctorybean"

>

<

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.schedule***ctorybean"

>

<

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啟動的優化

jspark 的這篇文章 開發階段eclipse下面的spring容器的啟動優化 講到如何加快spring的啟動速度。非常感謝jspark.一下是引用的原文 最近在負責乙個大專案,專案組成員包括專案經理大概10個人左右。專案技術用struts spring hibernate實現。專案的規模相對來說...

關於spring啟動的優化的問題

jspark 的這篇文章 開發階段eclipse下面的spring容器的啟動優化 講到如何加快spring的啟動速度。非常感謝 jspark.一下是引用的原文 最近在負責乙個大專案,專案組成員包括專案經理大概10個人左右。專案技術用struts spring hibernate實現。專案的規模相對來...

關於spring啟動的優化的問題

jspark 的這篇文章 開發階段eclipse下面的spring容器的啟動優化 講到如何加快spring的啟動速度。非常感謝jspark.一下是引用的原文 最近在負責乙個大專案,專案組成員包括專案經理大概10個人左右。專案技術用struts spring hibernate實現。專案的規模相對來說...