在数据库级别或会话中缓存用户特定数据

时间:2011-11-12 17:16:22

标签: jsf caching java-ee

用户特定数据应该在数据库级别还是在JSF会话范围内缓存?

1 个答案:

答案 0 :(得分:2)

这个问题没有一个尺寸适合所有答案。在分布式应用程序中,状态可以存储在客户端(cookie等),内存中的应用程序层,或者像数据库这样的更持久的存储中。你也不必选择一个 - 你可以结合。

相反,您需要考虑用户状态数据:

  • 在内存会话数据很简单,但你必须关注脚印 - 许多用户的大量内存占用可能会有问题。如果您要存储大量用户的MB数据,请考虑持久存储。
  • 在内存会话状态中,对于要扩展到许多应用程序层服务器的服务,可能会出现问题。它可以通过负载平衡亲和力来缓解,但也会抑制可伸缩性。
  • 在内存状态应该只保留该状态 - 用户数据应该保持不变。总是问问自己,如果这个应用程序层出现问题,我们会关注这个状态吗?用户可以恢复吗?有什么经历?持久存储具有这种优势。
  • 数据库更适合存储大量数据,但您可以进行往返检索。
  • 数据库更适合需要跨越会话的用户特定日期。
  • 客户端Cookie是一种选择,但您必须保持规模非常小,因为它们是随请求发送的。
  • 就像数据库一样,客户端cookie可以根据需要跨越会话。

还有其他组合,例如内存缓存,它们可以读取和写入数据库,并在一定的生命周期内缓存数据。如果数据不是绝对必须是最新的,那么这是一个选项。

另一种不同的方法是RESTful应用程序。

不要在服务中保持状态 - 一切都回到持久存储,资源可以在应用服务器外部缓存(akamai,客户端等......)。它通常会导致更具伸缩性的应用程序(即使单个操作可能不会那么快)。此时,持久存储选项定义了您的扩展方式。