如果我有很多Grails領域對象,我不想保存,但仍然可以在整個應用程序中訪問它們,將它們存儲在Grails/Hibernate會話中(尤其是關於性能)是明智的嗎?如果不是,還有什麼選擇?我可以使用Grails會話來存儲整個域對象嗎?
回答
你是什麼意思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中是單例,所以無論請求或客戶端如何,只要您的應用程序部署在單個課程實例中,就可以在整個應用程序中使用它。
非常感謝!更好的答案比我所希望的:) –
很高興聽到:) – Deigote
- 1. 可以使用對象存儲GE來存儲圖像嗎?
- 2. 在會話中存儲Grails/GORM域對象 - 爲什麼不呢?
- 3. 在登錄的springsecurity會話對象中存儲grails域變量
- 4. 我可以使用MongoDB在Symfony 2中存儲會話嗎?
- 5. 我可以在會話存儲中使用parseInt嗎?
- 6. 可能使用Grails派生屬性來檢索域對象嗎?
- 7. 我可以使用HttpContext.Application而不是Session來存儲會話特定數據嗎?
- 8. 我可以在會話中存儲xmlDocument對象嗎?如何執行seralization?
- 9. ASP.NET - 使用會話存儲FileUpload對象
- 10. 我們可以使用HDFS來存儲git存儲庫嗎?
- 11. 我可以使用Cassandra存儲對象嗎?
- 12. DDD存儲庫可以使用摘要對象來處理「真實」對象嗎
- 13. Azure存儲 - NodeJS - 我可以存儲對象嗎?
- 14. 存儲在會話對象
- 15. 我可以從NHibernate會話中分離一個對象嗎?
- 16. 學說 - 我可以使用mongo hash字段來存儲php對象嗎?
- 17. 我可以在對象中存儲對變量的引用嗎?
- 18. Grails:您可以使用Command對象創建/保存嗎?
- 19. 能創建一個對象來存儲多個域嗎?
- 20. 我可以使用assign來複制對象的對象嗎?
- 21. 本地和會話存儲可以在html 4中使用嗎?
- 22. Grails,使用會話中的值注入/填充域對象
- 23. 我們可以在請求作用域中定義一個會話作用域對象嗎?
- 24. asp.net你可以混合使用Cookie cookie會話存儲的會話數據嗎?
- 25. memcached可以存儲複雜對象嗎?
- 26. ASP.Net:如果我有會話ID,我可以獲得會話對象嗎?
- 27. 關於在會話中存儲整個LINQ對象的想法?
- 28. 存儲整個Facebook的圖形對象插入到PHP會話
- 29. 使用grails和memcached會話存儲過多的http會話
- 30. 我可以在會話變量中存儲腳本字典嗎?
模仿與src/groovy/class {bean}相同的domainClass並以此方式重用它,然後在準備就緒時使用該bean即新域(bean)。或者,參考grails事務回滾https://github.com/vahidhedayati/test-transactions進入它有點回滾多個對象,如果出現問題 – Vahid