将数据存储在会话中,如何以及何时检测数据是否过时

时间:2011-08-04 02:55:21

标签: java session java-ee

我的情景就是这个。

  1. 用户进行搜索
  2. 处理程序在会话中查找结果,存储
  3. 用户查看结果,决定点击其中一个进行查看
  4. 查看后,用户点击“返回搜索”
  5. 处理程序检测到其返回搜索,跳过搜索,而是从会话中检索
  6. 用户看到与预期相同的结果
  7. 在#5,如果创建了一个新项目并符合用户的搜索条件,那么它应该是结果的一部分。但是因为在#5中我只是从会话中检索它不会检测到它。

    我的问题是,我应该做一个额外的检查步骤吗?如果是这样,如何有效地检查而不进行实际检索(这会破坏目的)?也许选择count(*)....并将其与会话中结果集的计数进行比较?

4 个答案:

答案 0 :(得分:2)

这取决于您的业务需求。如果用户必须拥有最新的最新结果,那么您将不得不重新生成它们。

计数不会是100%,因为可能会有相应的删除。

您可能能够比较时间戳或其他东西,但我怀疑所涉及的所有复杂性只会引入更多问题。

保持简单并重新运行搜索。

答案 1 :(得分:1)

在会话中缓存某些搜索结果是我强烈建议的。 Web应用程序应努力使最小的会话状态成为可能。使用一揽子逻辑来缓存用户会话状态的搜索结果(可能至少几kb),这实际上是在寻找内存问题。

相反,您应该有一个单独的搜索服务来管理自己的缓存。虽然这在策略中看起来类似于会话内的缓存,但它有几个优点:

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

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

答案 2 :(得分:0)

为了查看是否有新项目,您可能需要重新运行搜索 - 即使只是为了计算。

您正在有效地缓存搜索结果。因此,正常答案是在一段时间后使结果到期(例如,结果仅有效1分钟),或者系统在数据更改时,缓存无效,导致搜索必须又跑了。

当用户返回时,是否可能有任何新结果?您只需在搜索结果页面上放置一个“刷新”按钮,即可再次运行搜索。

答案 3 :(得分:0)

您期望在数据库项目中提供什么样的刷新率?搜索结果是否会在短时间内发生剧烈变化,因为我不知道这种情况,但您可能会有不同的情况。

假设您有一个场景,您的数据库由一个或多个单独的线程填充,并且您有另一个独立的线程来搜索结果,请跟踪插入缓存中数据库的最新项目的时间戳。

现在,当用户想再次查看搜索结果时,比较时间戳,即将缓存时间戳与插入数据库的最后一项进行比较。如果没有匹配,则从缓存中重新查询else show。

如果您的方案确认我的假设是数据库没有得到太频繁的更新(例如,根据特定的搜索词或标准),那么这可以避免您经常查询数据库。