将模型存储在a中时要小心 会话。它的行为会有所不同 比你想象的还容易出来 与数据库同步。代替 将模型直接存储在 session,将id存储到模型中 用它来从中获取它 数据库中。
上面的最佳做法是将模型的ID放入会话中,然后稍后提取,还是应该通过整个模型?
答案 0 :(得分:1)
这取决于型号。如果它是一个仅与当前用户相关的实体,那么暗示它可能不会通过另一个用户或系统进行更改,并且该会话与其他任何地方一样可以存储它。 *如果每个用户经常影响某个用户,那么存储每个用户的副本也是有意义的。
另一方面,如果实体在用户之间共享,则应将其存储在cache或其他集中式持久性介质中,以便只有一个权威副本;并避免在重复的条目上浪费内存。
*但是,这会打开一组完全不同的缓存问题,而不是每次都要进入数据库,这只能通过对应用程序和使用模式的全面架构审查来解决。 WFE(Web前端)内存的需求是否低于数据库连接。是否比在其他地方保留副本更多或更少地检索实体?
答案 1 :(得分:0)
我不会在会话中存储整个模型,而是倾向于使用ID方法。原因是会话将在用户在您的站点上的整个时间内持续存在,并且在用户移动到不再需要数据的差异页面之后将不会清除该会话。如果用户访问您执行此类存储的许多页面,该怎么办?它可能会导致大量浪费的记忆。
如果这是许多用户可能使用的数据,您可能需要考虑使用Cache
而不是Session
,因为这样可以节省您在多个会话中复制相同数据。
编辑:注意到您的笔记说这是订单。您可以使用会话为用户存储“当前订单”并在提交/创建订单时将其清除/替换。你需要存储它,因为有多个步骤?在某些情况下,如果数据非常有限,您可以将其存储在cookie中,然后确保在订单完成后清除cookie。
答案 2 :(得分:0)
是,最好只存储ID,然后在需要时从数据库中检索/更新记录。
如果将整个对象存储在会话中,则基本上缓存,并且您需要了解所有相关的缓存问题(陈旧数据,内存大小等)。
保持整个事物的优势
缺点是
通过存储id,您基本上可以消除应用程序中的复杂程度(尽管添加对数据库的额外调用)。
答案 3 :(得分:0)
如果我需要存储用户怎么办? 输入到会话中,以便我可以重定向 到确认页面? - 然后我“有” 将模型放入会话
在这种情况下,您根本不需要将其放入会话中。将帖子直接发送到确认页面,您可以从帖子中获取值。在确认页面中,将值发送回客户端/隐藏字段或字段,具体取决于您决定发送它的方式。
还有各种不涉及使用会话的替代方案。