查看正在缓存/未能刷新的数据

Posted

技术标签:

【中文标题】查看正在缓存/未能刷新的数据【英文标题】:View data being cached/failing to refresh 【发布时间】:2013-11-25 09:52:01 【问题描述】:

我有一个包含表单不同部分的选项卡式面板。在一个部分中,用户可以将子文档添加到当前打开的文档中。在第二部分中,给了它们一个列表框,通过查看所有子文档的视图(通过当前文档的 ID 过滤)动态生成选项(通过@DbLookup)。此功能一切正常,但是动态列表框选项存在问题。

当用户添加一个新的子文档,然后切换到下一个选项卡时,列表框不会使用这个新文档进行更新。如果他们保存/重新编辑主文档或刷新页面,则没有什么不同,用户必须在返回原始文档之前加载另一个 XPage,以便更新列表框。我试图通过在@DBLookup 调用中使用 session.evaluate 和“NoCache”,或调用 database.getView(“My view”).refresh() 对页面进行全面更新来解决这个问题,但没有运气。

还有一个类似的问题,我有一个重复控件,它使用子文档的视图(再次按主文档 ID 过滤)作为数据源。当用户使用按钮添加子文档时,它会部分刷新重复 - 但在页面再次刷新(或者您离开页面并返回)之前不会显示新的子文档。

关于 JSF 生命周期/视图数据的缓存方式,我是否遗漏了一些重要的东西?

【问题讨论】:

【参考方案1】:

作为第一个措施,我将在列表框中添加另一个公式项,它只返回当前时间(@Now() 应该可以工作)。这样,您可以首先检查列表框选项是否在更新时刷新。

如果选项刷新得很好,很明显@DbLookup 确实做了一些缓存,尽管我不知道有任何默认缓存逻辑。

至少对于测试,我会更改代码以使用 NotesView 对象而不是 @DbLookup,如下所示:

var nview = database.getView("someview");
var nc = nview.getAllEntriesByKey(currentDocument.getDocument().getUniversalID(), true);
var a = [];
var ve = nc.getFirstEntry();
while (ve) 
  a.push(ve.getColumnValues().elementAt(0)); // value of first column
  ve = nc.getNextEntry(ve);

return a;

(代码是凭记忆写的,可能有语法错误)。

由于代码仅适用于视图条目,它应该与@DbLookup 一样快。如果需要,您甚至可以执行 nview.refresh() 。

【讨论】:

你记性很好,朱利安。 :) 我只建议进行两个更改。在nc 赋值中,添加true 的第二个参数以强制完全匹配,并在while 中添加另一行:ve = nc.getNextEntry(ve); 如果没有这个额外的操作,while 将永远不会退出。 ;) 如此真实!尴尬的是我忘记了 .getNextEntry()。这样的事情永远不应该发生(但我敢打赌它发生在我们所有人身上:-))。我修复了代码。感谢您的更正:-) 确实发生在我们所有人身上。好吧,至少,它发生在我身上。 :)

以上是关于查看正在缓存/未能刷新的数据的主要内容,如果未能解决你的问题,请参考以下文章

我的QQ浏览器不支持缓存了,每次后退都要刷新,怎么解决

刷新缓存的数据框?

缓存刷新和更新策略输入

ADFS登录的未能将发往连接字符串为 Data Source=“xxx”的 SQL 数据库的通知注册为缓存类型“ServiceStateSummary”的问题处理

全局缓存服务器数据并刷新视图

刷新缓存以防止基准测试波动