Java理论与实践: Web层的状态复制 - 编程入门网
在故障转移时,会话状态可能变得“过时 ”(是几次请求前的复制),并应当准备处理不是最新的会话内容。(例 如,如果一个interview 的第 3 步产生一个会话属性,而用户在第 4 步时,请 求被故障转移到一个具有两次请求之前的会话状态复制的系统上,那么第 4 步 的 servlet 代码应预备在会话中找不到这个属性,并采取相应的行动 —— 如重定向,而不是认定它会在那里、并在找不到它时抛出一个 NullPointerException 。)
容器支持 Servlet 容器的 HttpSession 复制选项以及如何配置这些选项是各不相同的。IBM WebSphere ®提供的复制选项是最多的,它提供了在内存中复制或者基于数据库的复制 、在 servlet 末尾或者基于时间的复制时间、传播全部会话快照(JBoss 3.2 或以后版本)或者只传播改变了的属性等选择。基于内存的复制基于 JMS 发布- 订阅,它可以复制到所有克隆、一个“伙伴”复制品或者一个专门的 复制服务器。 WebLogic 还提供了一组选择,包括内存中(使用一个伙伴 复制品)、基于文件的或者基于数据库的。JBoss 与 Tomcat 或者 Jetty servlet 容器一同使用时,进行基于内存的复制,可以选择 servlet 末尾或者 基于时间的复制时间,而快照选项(在 JBoss 3.2 或以后版本)是只复制改变 了的属性。Tomcat 5.0 为所有群集节点提供了基于内存的复制。此外,通过像 WADI 这样的项目,可以用 servlet 过滤机制将会话复制添加到像 Tomcat 或者 Jetty 这样的 servlet 容器中。 改进分布式 Web 应用程序的性能 不管决定使用什么机制进行会话复制,可以用几种方式改进 Web 应用程序的 性能和伸缩性。首先记住,为了获得会话复制的好处,需要在部署描述符中将 Web 应用程序标记为 distributable,并保证在会话中的所有内容都是可序列化 的。 Java理论与实践: Web层的状态复制(3)时间:2010-12-21 IBM Brian Goetz保持会话最小 因为复制会话有随着会话中的对象图(object graph) 的变大而增加成本, 所以应当尽可能地在会话中少放置数据。这样做会减少复制的序列化的开销、网 络带宽要求和磁盘要求。特别地,将共享对象存储在会话中一般不是好主意,因 为它们需要复制到它们所属的 每一个会话中。 不要绕过 setAttribute 在改变会话的属性时,要知道即使 servlet 容器只是试图做最小的更新(只 传播改变了的属性),如果没有调用 setAttribute ,容器也可能没有注意到已 经改变的属性。(想像在会话中有一个 Vector ,表示购物车中的商品 —— 如 果调用 getAttribute() 获取 Vector 、然后向它添加一些内容,并且不再次调 用 setAttribute ,容器可能不会意识到 Vector 已经改变了。) 使用细化的会话属性 对于支持最小更新的容器,可以通过将多个细化的对象而不是一个大块头放 到会话中而降低会话复制的成本。这样,对快速改变的数据的改变也不会迫使容 器去序列化并传播慢速改变的数据。 完成后使之失效 如果知道用户完成了会话的使用(如,用户选择注销登录),确保调用 HttpSession.invalidate() 。否则,会话将持久化直到它失效,这会消耗内存 ,并且可能是长时间的(取决于会话超时时间)。许多 servlet 容器对可以跨 所有会话使用的内存的数量有一个限制,达到这个限制时,会序列化最先使用的 会话并将它写到磁盘上。如果知道用户使用完了会话,可以使容器不再处理它并 使它作废。 保持会话干净 如果在会话中有大的项,并且只在会话的一部分中使用,那么当不再需要时 应删除它们。删除它们会减少会话复制的成本。(这种做法类似于使用显式 nulling 以帮助垃圾收集器,老读者知道我一般不建议这样做,但是在这种情况 下,因为有复制,在会话中保持垃圾的成 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |