2009-12-11 66 views
28

幫助!我正在向Grails移植一個大型的Ruby應用程序 - 但我的應用程序的Grails啓動需要2分多鐘。Grails啓動慢

我已經將dbCreate設置爲「read」我已經確保了我的高端雙處理器桌面窗口框爲Grails提供了所需的RAM(1 Gig)。我沒有安裝插件。我有170個域類,曾經是紅寶石類。

當它啓動時,它打印出「Running Grails App ..」這一行,然後掛起很長時間,然後打印出「服務器運行」行。

我只是做了一些事情,我把我所有的ids都遷移到了bigint。這似乎加劇了這個問題。現在啓動大約需要10分鐘。

我是新來的grails,請你給我一些關於什麼和在啓動時記錄事件的更多細節?至於分析這個虛擬機,自從我做了很多Java之後的幾年。你現在推薦什麼作爲最好的分析工具?

我還能做些什麼來加速Grails的啓動?

回答

10

不幸的是,我不知道你已經做了什麼以外的事情可以做得太多。如您所知,啓動時有很多事情要做,包括所有插件的解析/加載,將動態方法添加到您的域對象以及Groovy的整體動態特性。

我不確定你使用的是哪個版本,但我已經要求在1.2中啓動時關閉依賴檢查的功能,因爲這也增加了一大堆啓動時間。

我意識到上面並沒有太大的幫助,所以也許這將是:我將我的應用程序分成幾個插件。一個用於域對象,一個用於繪圖功能,一個用於Excel導入,另一個用於我需要的一些UI構造。我沒有這樣做,僅僅是因爲啓動時間較慢,但優點是我可以在將所有內容集成在一起之前,分別測試系統的各個部分。

我即將添加一個涉及至少10個新域對象的新功能,並且我首先通過爲他們必須與核心應用程序進行交互的少數對象提供存根來在單獨的插件中開發它們。這使我既能縮短啓動時間,又能更好地隔離我的代碼。

因此,如果它是您的選擇,嘗試分離出的東西,所以你可以單獨工作,這將緩解你的問題。在讓您的團隊分別在較小的組件上工作,更好的模塊化等方面可能還有其他好處。

希望這對您有所幫助。

1

您可能想要查看是否有其他旋鈕可以轉爲Grails以外的其他旋鈕以解決此問題。

您是否試圖將此視爲性能問題?你可以看看盒子的性能,並試圖找出瓶頸是什麼。它是CPU嗎?這是一個磁盤讀取問題?您能否將探查器附加到虛擬機上,並查明大部分啓動時間的使用情況?

3

170域類是相當大的,但2分鐘仍然看起來對我來說真的很長。你有很多插件安裝?可能過於冗長的調試設置?

我很好奇,如果您創建了一個全新的grails應用程序,並將其複製到您的所有域對象(以及域對象可能需要實際操作的插件的子集)中並花費多長時間開始。

吉恩關於如果可能的話把事情分開的建議是一個很好的建議。我在以前的項目中做過類似的事情,我們有一個域名插件,而其他應用都依賴於該域名插件。

您也可以使用grails events記錄啓動時的一些時間信息,以查看瓶頸位置。定時「PluginInstalled」事件應該是好的,因爲我認爲除了其他插件外,hibernate插件會被這個問題所困擾。

2

您可能有依賴關係問題。如果您使用的插件依賴於具有「開放式」依賴性的maven庫,那麼grails將會每次檢查是否有更新的版本可以在該範圍內下載。我不知道爲什麼有人會這樣指定它。看來這會導致不可靠的行爲。對我來說,罪魁禍首是亞馬遜的java aws庫,自然被一個與亞馬遜雲對話的插件使用。

http://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk/1.2.10

註釋如何它的一些依賴都是這樣

org.apache.httpcomponents HttpClient的[4.1,5.0)

,似乎每一次,Grails是尋找一個新版本(如果它存在,下載,我只是注意到,當我這次運行時,httpclient的4.2-alpha1會下降)。

通過從插件去除依賴和手動添加需要的庫,以我的.lib文件夾,我減少了我的啓動時間從> 30秒到1秒<

0

你有沒有嘗試過這樣的基礎進一步部署到一個servlet你選擇的容器還是in-place .war bootstrapping?

grails -Ddisable.auto.recompile=true run-app 

grails run-war 

grails war