2012-03-29 45 views
2

UPDATE中。檢查這些benchmarks以便自己測試。Grails。將只讀集合存儲在變量

我應該對象的集合存儲在一些服務的這樣一個變量:

ConfigService{ 
    private def countries = Country.findAllBySomeCondition() 

    public def countries(){ 
     return countries 
    } 
} 

或使用:

ConfigService{ 

    public def countries(){ 
     return Country.findAllBySomeCondition() 
    } 
} 

如果集合會經常只用於讀取。

回答

2

依賴。在你的第一個例子中,該值緩存,這可能是一個小更高效,但如果在某些時候加入更多的國家,他們可能不會對您的服務請求出現。但是,如果您經常在第二個示例中調用.countries(),則可能會產生一些性能問題。

最好的選擇可能是獲取一些基準測試查詢需要多長時間,並決定是否最好自己嘗試緩存值,或確保它始終是最新的。我的建議是堅持使用第二個例子,如休眠處理一些緩存你們,機會是列表不是大到足以顯著阻礙你的應用程序。

+0

提出了一些標準。檢查在問題標題處張貼的鏈接。 – vogdb 2012-04-22 13:31:41

1

@ GrailsGuy的回答是點上,我給了他一個+1。爲您提供一些其他的選項,你可以:

1)如果你的國家的名單並沒有改變,你可以把它們放在一個枚舉,避免DB都在一起。 2)如果您賦予用戶添加/刪除/編輯國家的能力,那麼您可以像在示例1中一樣緩存列表,但是當用戶添加/刪除/編輯國家時,您可以強制重新加載列表。

ConfigService{ 
    private def countries 

    public def countries(){ 
     if(countries == null) { 
      countries = Country.findAllBySomeCondition() 
     } 
     return countries 
    } 
} 

CountryService { 
    def configService 

    def addCountry() { 
     //Do add country stuff 
     configService.countries = null 
    } 
} 

這樣你就可以緩存國家,直到他們得到更新。就像@GrailsGuy所說,儘管Hibernate會在一定程度上爲你做到這一點。