2015-08-03 77 views
1

如果我有很多Grails領域對象,我不想保存,但仍然可以在整個應用程序中訪問它們,將它們存儲在Grails/Hibernate會話中(尤其是關於性能)是明智的嗎?如果不是,還有什麼選擇?我可以使用Grails會話來存儲整個域對象嗎?

+1

模仿與src/groovy/class {bean}相同的domainClass並以此方式重用它,然後在準備就緒時使用該bean即新域(bean)。或者,參考grails事務回滾https://github.com/vahidhedayati/test-transactions進入它有點回滾多個對象,如果出現問題 – Vahid

回答

4

你是什麼意思grails/hibernate session

如果你真的指的是Hibernate會話,向它添加一個對象將激發對象在會話刷新時自動保存(除非對象未驗證,在這種情況下會話將會丟失丟棄)。會話根據請求創建和分發。

如果您的意思是session對象被自動注入到控制器和視圖中,它既不是Hibernate特有的,也不是grails,而只是Servlet規範(請參閱http://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpServletRequest.html)中的舊的普通HttpSession。

如果您需要跨同一個客戶端的多個請求訪問它們,您可以使用它來存儲任何類型的對象。這意味着會話對於給定的客戶端是私人的(通過jsessionid cookie識別它)並且存在多個請求。如果您不需要多個請求位,將它們添加爲請求屬性就足夠了。

把事情放在會話中一般很好,很快(因爲默認情況下是基於內存),但是如果濫用,它會增加應用程序的內存佔用量,並且會阻止水平縮放(例如,將同一個應用程序部署到多個實例),除非使用粘性會話機制(或會話持續)。

請記住,儘管Grails使用每個請求的新Hibernate會話(而不是Http會話:),所以如果您將附加到Hibernate會話的對象添加到Http會話,然後關閉Hibernate會話,你可能會遇到問題。這不應該影響非保存的對象(它們不是來自Hibernate會話),但它可能會影響它們的關聯(其他域的類來自數據庫,因此是Hibernate會話)。如果是這種情況,您可能需要重新附加它們。請參閱https://grails.github.io/grails-doc/latest/ref/Domain%20Classes/attach.html

另外,如果會話失效(因爲用戶註銷或服務器重新部署),那麼存儲在那裏的所有內容都將消失。

如果您不想依賴會話,您可以創建自己的MemoryBasedStoreService服務,並使用ConcurrentHashMap或類似的機制來存儲和檢索對象。由於服務在Grails中是單例,所以無論請求或客戶端如何,只要您的應用程序部署在單個課程實例中,就可以在整個應用程序中使用它。

+0

非常感謝!更好的答案比我所希望的:) –

+0

很高興聽到:) – Deigote

相關問題