Xpages 掉出服务器端缓存
Xpages falling out of server side cache
此问题可能与非常具体的 Domino 版本有关(见下文),因此我从一些技术细节开始:
有问题的服务器是虚拟化的 Windows 2008 R2 64 位机器。 Domino 版本是
IBM Domino (r) Server (64 Bit) (Release 9.0.1FP4 HF70 for Windows/64)
已安装最新的 JVM 安全补丁(9.0.1.4 20150724)。
我可能是错的,但我觉得问题是在我们安装了最新的补丁(FP4 HF70 和 JVM 之后开始的):
在 Xpage 上,我有一个非常简单的 "Refresh" 类型按钮,它只触发围绕我页面大部分的 xp:panel
(id="pnMainContainer"
) 的部分刷新。在其他组件中,pnMainContainer
内有一个选项卡式面板。这设置为在加载页面时使用三个选项卡中的第一个打开。
假设我打开了第三个选项卡,通常如果我单击“刷新”按钮选项卡 #3 会保持打开状态,并且其内容会按预期刷新。
然而,有时候,在我让页面打开几分钟后(不能真正说出多长时间,可能大约半小时左右),刷新显然返回到其初始状态,而是显示第一个选项卡之前打开的那个,并清空之前填写的所有可编辑字段。
发生这种情况时,我会在控制台上看到以下警告:
HTTP JVM: WARNING: CLFAD####W: State data not available for /myPage
because no control tree was found in the cache.
我知道这个 post 在这里:,虽然我没有在我的应用程序中使用 Xagents,但我尝试将我的页面的 viewState
属性 设置为nostate
。这显然无助于解决问题。
另一个可能有用的细节是,有问题的页面使用绑定到 viewScope 的 managedBean。
知道是什么原因造成的吗?此外,如何改变这种行为?
2015-09-10 更新: 按照下面@Paul 的建议,我昨晚将应用程序的会话超时设置为 120 分钟(xsp.session.timeout=120
).今天早上我再次尝试:加载有问题的页面然后让它在那里停留大约。 45分钟。在那之后点击我的部分刷新按钮。结果:页面重新加载到初始状态,服务器控制台显示与昨天相同的警告。
为了完整起见,这里是我的应用程序 xsp.properties 目前的全部内容:
xsp.error.page.default=true
xsp.library.depends=com.ibm.xsp.extlib.library
xsp.resources.aggregate=true
xsp.theme=oneuiv3.0.2
xsp.session.timeout=120
xsp.application.timeout=120
xsp.persistence.mode=basic
里面可能有什么东西会导致这种行为吗?
Some more details:
进行了更多测试并发现了以下详细信息:
- 使用上面提到的 xsp.properties 缓存似乎可以稳定一段时间,只要我让页面就这么放在那里
- 只要我在我的页面或相关代码(SSJS 库、托管 bean 或页面本身)中的某个位置进行任何类型的调整,就需要重建缓存,因为我的页面状态丢失(即使在几秒钟)。在 Designer 中是否打开 "Build automatically" 完全没有关系
- 已尝试将页面持久性从
xsp.persistence.mode=basic
设置为 xsp.persistence.mode=file
。这会在我打开选项卡 #3 时立即产生 "java.io.NotSerializableException",它使用在 viewScope 级别注册的 managedBean 的内部属性
- 在同一台服务器上构建了一个非常简单的应用程序,只有几个部分刷新按钮:结果是该测试应用程序的页面永远不会丢失页面状态
只要缓存仅在我更新设计时丢失,我就不在乎。但我担心如果许多用户开始访问这些页面,这可能会升级。
我还能做些什么来提高性能?
viewState="nostate" 基本上意味着不要存储此页面服务器端的组件树或作用域变量。这就是为什么您将它用于永远不会部分刷新的 XAgents 的原因。
关键数据是:
1) XPages 会话设置为超时的速度有多快。一旦超时,您将丢失状态数据。我认为 keepSessionAlive 控件在这里没有帮助。
2) 是否正在浏览器中打开其他选项卡。还有其他 XPages 属性确定存储在内存/磁盘中的页数。最大值存储在整个浏览器会话中,一旦达到最大值,最早的就会从内存中删除,因此会出现相同的消息(以及在 XAgents 上设置 nostate 的另一个原因。
听起来第一个是原因。请注意,XPage 会话超时和 http 超时是不同的超时。第一个是当前会话的状态数据被删除并且是特定于应用程序的(因为每个 XPages 应用程序都有一个单独的运行时 JVM),第二个是对浏览器的后续请求将提示进行身份验证。
此问题可能与非常具体的 Domino 版本有关(见下文),因此我从一些技术细节开始:
有问题的服务器是虚拟化的 Windows 2008 R2 64 位机器。 Domino 版本是
IBM Domino (r) Server (64 Bit) (Release 9.0.1FP4 HF70 for Windows/64)
已安装最新的 JVM 安全补丁(9.0.1.4 20150724)。
我可能是错的,但我觉得问题是在我们安装了最新的补丁(FP4 HF70 和 JVM 之后开始的):
在 Xpage 上,我有一个非常简单的 "Refresh" 类型按钮,它只触发围绕我页面大部分的 xp:panel
(id="pnMainContainer"
) 的部分刷新。在其他组件中,pnMainContainer
内有一个选项卡式面板。这设置为在加载页面时使用三个选项卡中的第一个打开。
假设我打开了第三个选项卡,通常如果我单击“刷新”按钮选项卡 #3 会保持打开状态,并且其内容会按预期刷新。
然而,有时候,在我让页面打开几分钟后(不能真正说出多长时间,可能大约半小时左右),刷新显然返回到其初始状态,而是显示第一个选项卡之前打开的那个,并清空之前填写的所有可编辑字段。
发生这种情况时,我会在控制台上看到以下警告:
HTTP JVM: WARNING: CLFAD####W: State data not available for /myPage because no control tree was found in the cache.
我知道这个 post 在这里:viewState
属性 设置为nostate
。这显然无助于解决问题。
另一个可能有用的细节是,有问题的页面使用绑定到 viewScope 的 managedBean。
知道是什么原因造成的吗?此外,如何改变这种行为?
2015-09-10 更新: 按照下面@Paul 的建议,我昨晚将应用程序的会话超时设置为 120 分钟(xsp.session.timeout=120
).今天早上我再次尝试:加载有问题的页面然后让它在那里停留大约。 45分钟。在那之后点击我的部分刷新按钮。结果:页面重新加载到初始状态,服务器控制台显示与昨天相同的警告。
为了完整起见,这里是我的应用程序 xsp.properties 目前的全部内容:
xsp.error.page.default=true
xsp.library.depends=com.ibm.xsp.extlib.library
xsp.resources.aggregate=true
xsp.theme=oneuiv3.0.2
xsp.session.timeout=120
xsp.application.timeout=120
xsp.persistence.mode=basic
里面可能有什么东西会导致这种行为吗?
Some more details:
进行了更多测试并发现了以下详细信息:
- 使用上面提到的 xsp.properties 缓存似乎可以稳定一段时间,只要我让页面就这么放在那里
- 只要我在我的页面或相关代码(SSJS 库、托管 bean 或页面本身)中的某个位置进行任何类型的调整,就需要重建缓存,因为我的页面状态丢失(即使在几秒钟)。在 Designer 中是否打开 "Build automatically" 完全没有关系
- 已尝试将页面持久性从
xsp.persistence.mode=basic
设置为xsp.persistence.mode=file
。这会在我打开选项卡 #3 时立即产生 "java.io.NotSerializableException",它使用在 viewScope 级别注册的 managedBean 的内部属性 - 在同一台服务器上构建了一个非常简单的应用程序,只有几个部分刷新按钮:结果是该测试应用程序的页面永远不会丢失页面状态
只要缓存仅在我更新设计时丢失,我就不在乎。但我担心如果许多用户开始访问这些页面,这可能会升级。
我还能做些什么来提高性能?
viewState="nostate" 基本上意味着不要存储此页面服务器端的组件树或作用域变量。这就是为什么您将它用于永远不会部分刷新的 XAgents 的原因。
关键数据是: 1) XPages 会话设置为超时的速度有多快。一旦超时,您将丢失状态数据。我认为 keepSessionAlive 控件在这里没有帮助。 2) 是否正在浏览器中打开其他选项卡。还有其他 XPages 属性确定存储在内存/磁盘中的页数。最大值存储在整个浏览器会话中,一旦达到最大值,最早的就会从内存中删除,因此会出现相同的消息(以及在 XAgents 上设置 nostate 的另一个原因。
听起来第一个是原因。请注意,XPage 会话超时和 http 超时是不同的超时。第一个是当前会话的状态数据被删除并且是特定于应用程序的(因为每个 XPages 应用程序都有一个单独的运行时 JVM),第二个是对浏览器的后续请求将提示进行身份验证。