我的公司已超出其单实例Tomcat服务器,因此需要运行多个实例。但是,在代码中有许多静态变量可以跟踪包括对象在内的各种数据。 (当然,让刺戳和嘲笑开始。:)我已经考虑过移动静态变量来存储在Redis中,但这可能是很多工作。是否有更简单的方法在Tomcat实例之间共享可变的静态变量信息?
更新:根据@jake的建议,关于变量性质的说明。这些变量主要存储整个服务的聚合信息,例如过去一小时内登录的用户信息,访问的各种功能等。
答案 0 :(得分:2)
你正在谈论拥有一个集群。所以你需要一套新的范例。您可以将此图像视为示例: Distributed system overview http://a3ab771892fd198a96736e50.javacodegeeks.netdna-cdn.com/wp-content/uploads/2012/11/session-repicate1.png
请参阅此链接,详细了解clustering and load balancing。
答案 1 :(得分:1)
" [..]许多静态变量"坦率地说,跟踪webapp上的可变信息听起来很恐怖。如果并发处理不好,这可能是各种错误/问题的根源。但更重要的是,即使并发 正确完成,也可能导致资源争用性能问题,这会使您的应用程序超出其单实例生命。在这种情况下,即使您通过替换某些类型的更强大的数据存储(您可能应该这样做)来解决实现问题,增加的网络延迟也可能会大大加剧该问题。
我建议查看这些变量是什么,并确定它们是否确实需要在整个分布式应用程序中共享。如果它们被证明是为了避免重新计算或从数据库重新获取而被缓存的东西,那么也许你可以避免将它们放在一个集中的数据存储区中,并做一些更简单的事情,比如将它们放在@EJP推荐的应用范围内。
我们需要针对其中一些变量的更具体的使用场景来提出更好的建议。
答案 2 :(得分:0)
你不能这样做,因为不同的tomcat实例基本上是不同的进程(可能在不同的机器上),具有单独的堆空间。
这与存储会话变量的问题相同(尽管Tomcat允许跨实例复制会话变量),因为扩展实例的复制会产生相当大的开销(和性能瓶颈)。
所以即使你能设法复制一切,你只是为了以后推迟你的问题,而不是解决它。对于扩展任何类型的服务器端存储是不鼓励的。 如果绝对必要的分布式缓存是正确的方向。或者您可以将所有内容存储在DB中(增加了DB调用的开销)。
参考
In Java, are static class members shared among programs?
session in cookis pattern