1 dns performance session grails object
如果我有一些我不想保存的Grails域对象,但仍然可以在我的应用程序中访问它们,那么将它们存储在Grails/Hibernate会话中是否明智(特别是关于性能)?如果没有,有什么替代方案?
grails/hibernate会话是什么意思?
如果你真的是指Hibernate会话,向它添加一个对象会激活在刷新会话时自动保存的对象(除非对象没有验证,在这种情况下,一旦会话被丢弃就会丢失).根据请求创建并删除会话.
如果你的意思是session自动注入到控制器和视图中的对象,那么它既不是Hibernate特有的,也不是grails,而只是来自Servlet规范的旧的,简单的HttpSession(参见http://docs.oracle.com/javaee/7/api/) javax/servlet/http/HttpServletRequest.html).
如果需要在同一客户端的多个请求中访问它们,则可以使用它来存储任何类型的对象.这意味着会话对于给定的客户端是私有的(通过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中的单例,因此无论请求或客户端如何,您都可以在整个应用程序中使用它 - 只要您的应用程序部署在单个实例中当然:).
| 归档时间: |
|
| 查看次数: |
757 次 |
| 最近记录: |