如何在Tomcat的多个实例之间共享静态变量数据?

问题描述 投票:1回答:3

我的公司的单实例Tomcat服务器已经不复存在,因此需要运行多个实例。但是,在代码中,有许多静态变量可以跟踪包括对象在内的各种数据。 (当然,让戳戳开始吧。:)我已经考虑过将静态变量存储在Redis中,但这可能需要大量工作。有没有更简单的方法可以在Tomcat实例之间共享可变的静态变量信息?

更新:根据@jake的建议,有关变量性质的注释。这些变量主要存储整个服务的汇总信息,例如过去一个小时内登录的用户的信息,访问的各种功能等。

java server tomcat7
3个回答
2
投票

您正在谈论拥有一个集群。因此,您需要一组新的范例。您可以看到以下图像作为示例:Distributed system overview

请参阅此链接以了解有关clustering and load balancing的更多信息。


1
投票

“ [..]许多静态变量”坦率地说,跟踪整个Web应用程序中的可变信息听起来很恐怖。如果并发处理不当,则可能是各种错误/问题的根源。但是更重要的是,即使并发is正确完成,仅此一项就可能会导致资源争用性能问题,使您的应用超出其单实例寿命。在这种情况下,即使您通过替换为某种类型的更健壮的数据存储来解决该实现(您可能应该这样做),增加的网络延迟也可能会大大加剧该问题。

我建议检查那些变量是什么,并确定每个变量是否确实确实需要在整个分布式应用程序之间共享。如果发现它们只是为了避免重新计算或从数据库中重新获取而缓存的内容,那么您可以避免将它们放在集中式数据存储中,并做一些更简单的事情,例如将它们放入@EJP建议的应用程序范围中。

我们需要有关其中一些变量的更具体的使用场景,以便提出更好的建议。


0
投票

您不能执行此操作,因为不同的tomcat实例基本上是具有单独堆空间的不同进程(可能在完全不同的机器上)。这是与存储会话变量相同的问题(尽管Tomcat允许在实例之间复制会话变量)当您扩大在实例之间的复制变得相当大的开销(和性能瓶颈)

因此,即使您可以设法复制所有内容,也只会将问题推迟到以后再解决,而不能解决。不建议使用任何类型的服务器端存储进行扩展。 如果绝对必要,则分布式缓存是正确的方向。或者,您可以将所有内容存储在数据库中(增加了数据库调用的开销)。

参考In Java, are static class members shared among programs?session in cookis pattern

© www.soinside.com 2019 - 2024. All rights reserved.