Coldfusion:最好只在会话中保留user_id,还是整个用户对象?

Gro*_*ain 3 coldfusion session

我有一个cfc来处理用户对象.我的问题是:在会话中只存储user_id并在每次请求时重新创建用户对象更好吗?或者最好将整个用户对象存储在会话中?

以下是我的想法:

  • 如果我将整个对象存储在会话中:

    • 处理器开销可能会减少
    • 可能会有更多的内存开销
    • 所有方法/函数都存储在实际对象中,并且我在cfc中更新的新函数将不可用,除非用户注销并重新登录,或者我设计了某种方法使其自行刷新.
    • 如果我通过并发的ajax调用弄乱对象,可能会出现互斥或锁定问题
  • 如果我只在会话中存储user_id:

    • 我将不得不用每个页面请求创建用户对象(可能更多的处理器开销)
    • 内存开销可能会减少
    • 因为每个请求都有自己的用户对象副本,所以没有机会获得互斥锁/锁定/竞争条件
    • CFC模型本身的更新将立即在整个系统中识别,用户无需注销并重新登录

这种事情有正常的做法吗?我是在过度思考吗?

Edw*_*ith 5

我编写的所有CF应用程序都针对高流量和高可用性,因此我们从未考虑过单一服务器实践.

因此,根据我的经验,我总是不得不a)允许多个负载均衡的服务器,以及b)出于多种原因避免负载均衡器上的粘性会话.因此,我们至少需要让服务器成为集群中的一部分,并获取会话中的流量.

因此,我们总是在每个请求中从共享数据存储中提取"会话"数据.

我的建议是实现一个会话门面.

这使您可以选择更改会话数据(如用户记录)的持久性,而无需更改应用程序的其余部分.

您可以在后台选择将所有内容存储在会话范围内,为每个请求加载,执行混合,使用键值存储等等.

您可以选择是否加载数据,延迟加载数据或其间的任何混合,并且应用程序的其余部分无需了解您已完成的操作.

论竞争条件

如果您关注竞争条件,那么我建议在数据提交和访问时使用命名锁.这是使用外观的另一个好处 - 您的应用程序代码不需要知道这一点,并且您可以选择将锁定放在某些对象周围,而不是锁定整个会话.