2008-09-17 117 views
4

Tomcat(版本5在这里)将会话信息存储在内存中。将群集此信息时定期广播到群集中的其他服务器以保持同步。您可以使用数据库存储来使会话保持持久性,但该信息只能定期写入,并且仅用于故障恢复,而不是实际替换内存中会话。有没有办法用Tomcat指定不同的会话存储?

如果您不想使用粘性会话(我们的配置不允许它不幸),这会引发会话不同步的问题。

在其他语言中,Web框架倾向于允许您使用数据库作为主会话存储。虽然这引入了潜在的扩展问题,但它确实使会话管理非常简单。我想知道是否有办法让tomcat以这种方式使用数据库进行会话(从技术上讲,这也将消除对tomcat server.xml中的任何群集配置的需求)。

+1

如果你不使用粘性会话,那么你就违背了servlet规范中的一个要求 - 同一个会话的请求由同一个JVM提供。 Tomcat使这非常困难。将会话保存在数据库中可能会导致丢失更新问题。 – davidsheldon 2009-04-23 20:43:14

回答

3

确实有办法。虽然我会强烈投票支持粘滞会话 - 为您的服务器/数据库节省如此多的负载(除非出现问题)...

http://tomcat.apache.org/tomcat-5.5-doc/config/manager.html有关于Tomcat的SessionManager配置和设置的信息。根据您的具体要求,您可能需要实现自己的会话管理器,但这个起点应该提供一些帮助。

2

看看Terracotta,我认为它可以解决您的缩放问题,而无需重新设计主要应用程序。

2

我一直是Rails会话技巧的粉丝:将会话(压缩加密+加密签名)存储在用户的cookie中。这样你就可以对你的内容进行负载均衡,而不必担心粘性会话,或者为会话数据触及数据库等等。我只是不确定你能否在Java应用程序中轻松实现这些功能,而无需进行某种排序重写会话访问代码。无论如何只是一个想法。

+1

Cookie在空间和数量上可以分配的空间非常有限。每个网域最多约20个Cookie,每个Cookie最多约4KB。 – BalusC 2010-07-29 14:56:22

2

另一种选择是memcached-session-manager,这是一个基于memcached的会话故障转移和tomcat 6.x/7.x的会话复制解决方案。它支持粘性会话和非粘性会话。

我创建了这个项目,以获得最佳的性能和可靠性,并且能够通过添加更多的tomcat和memcached节点来扩展。

相关问题