J2EE应用程序的Web层状态复制

豆豆网   技术应用频道   2006年11月27日    社区交流

本文详细介绍J2EE应用程序的Web层状态复制

  不管决定使用什么机制进行会话复制,可以用几种方式改进 Web 应用程序的性能和伸缩性。首先记住,为了获得会话复制的好处,需要在部署描述符中将 Web 应用程序标记为 distributable,并保证在会话中的所有内容都是可序列化的。

  保持会话最小

  因为复制会话有随着会话中的对象图(object graph) 的变大而增加成本,所以应当尽可能地在会话中少放置数据。这样做会减少复制的序列化的开销、网络带宽要求和磁盘要求。特别地,将共享对象存储在会话中一般不是好主意,因为它们需要复制到它们所属的 每一个 会话中。

  不要绕过 setAttribute

  在改变会话的属性时,要知道即使 servlet 容器只是试图做最小的更新(只传播改变了的属性),如果没有调用 setAttribute,容器也可能没有注意到已经改变的属性。(想像在会话中有一个 Vector,表示购物车中的商品 —— 如果调用 getAttribute() 获取 Vector、然后向它添加一些内容,并且不再次调用 setAttribute,容器可能不会意识到 Vector 已经改变了。)

  使用细化的会话属性

  对于支持最小更新的容器,可以通过将多个细化的对象而不是一个大块头放到会话中而降低会话复制的成本。这样,对快速改变的数据的改变也不会迫使容器去序列化并传播慢速改变的数据。

  完成后使之失效

  如果知道用户完成了会话的使用(如,用户选择注销登录),确保调用 HttpSession.invalidate()。否则,会话将持久化直到它失效,这会消耗内存,并且可能是长时间的(取决于会话超时时间)。许多 servlet 容器对可以跨所有会话使用的内存的数量有一个限制,达到这个限制时,会序列化最先使用的会话并将它写到磁盘上。如果知道用户使用完了会话,可以使容器不再处理它并使它作废。

  保持会话干净

  如果在会话中有大的项,并且只在会话的一部分中使用,那么当不再需要时应删除它们。删除它们会减少会话复制的成本。(这种做法类似于使用显式 nulling 以帮助垃圾收集器,老读者知道我一般不建议这样做,但是在这种情况下,因为有复制,在会话中保持垃圾的成本要高得多,因此值得以这种方式帮助容器。)

  结束语

  通过 HttpSession 复制,Servlet 容器可以在构建复制的、高可用性的 Web 应用程序方面给您减轻很多负担。不过,对于复制有一些配置选项,每个容器都不一样,复制策略的选择对于应用程序的容错、性能和伸缩性有影响。复制策略的选择不应当是事后的 —— 您应当在构建 Web 应用程序时就考虑它。并且,一定不要忘记进行负载测试以确定应用程序的伸缩性 —— 在客户替您做之前。

责编:豆豆技术应用

正在加载评论...