java - 在 session 中存储数据,如何以及何时检测数据是否过时

标签 java session jakarta-ee

我的场景是这样的。

  1. 用户进行搜索
  2. 处理程序查找结果,存储在 session 中
  3. 用户看到结果,决定点击其中一个进行查看
  4. 查看后,用户点击“返回搜索”
  5. 处理程序检测到其返回搜索,跳过搜索并从 session 中检索
  6. 用户看到的结果与预期相同

在#5,如果创建了一个新项目并且符合用户的搜索条件,那么它应该成为结果的一部分。但由于在 #5 中我只是从 session 中检索它不会检测到它。

我的问题是,我应该进行额外的检查步骤吗?如果是这样,如何在不进行实际检索的情况下进行有效检查(这会达不到目的)?也许可以选择 count(*) .... 并将其与 session 中结果集的计数进行比较?

最佳答案

我强烈建议不要在 session 中缓存某些搜索结果。 Web 应用程序应努力拥有尽可能最小的 session 状态。放入总括逻辑来根据用户 session 状态缓存搜索结果(大概至少有几个 kb)实际上会带来内存问题。

相反,您应该有一个管理自己的缓存的单例搜索服务。尽管这在策略上看起来与 session 内缓存相似,但它有几个优点:

  • 您可以重复使用用户之间常见的搜索结果;根据搜索类型,这可能很重要
  • 您可以在服务层管理缓存大小;像 ehcache 这样的东西很容易实现,并为您提供大量的可配置性(并防止内存不足问题)
  • 可以在服务层管理缓存有效性;即,如果“更新项目”服务已触发其 save() 方法,它可以告诉搜索服务使其整个缓存无效或仅使与新更新/创建的项目相对应的缓存结果无效。

上面的第三点解决了您的主要问题。

关于java - 在 session 中存储数据,如何以及何时检测数据是否过时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6935698/

相关文章:

ios - 使用 Java Enterprise 创建 iOS 应用程序

jakarta-ee - JAX-RS 中未发生 @Resource 注入(inject)

java - 如何在 Quarkus 中禁用安全性

java - 覆盖序列化

php - 现在还使用 PHP session 吗?

database - session 不会自动从数据库中删除?

eclipse - 有人可以向我解释 Maven 2(或 3)依赖解析吗?

java - 如何在不使用java数组或集合类中的任何方法的情况下比较2个数组?

java - JScrollPane 的问题

java - request.getSession() 和 request.getSession(true) 的区别