【问题标题】:Is there a way to specify a different session store with Tomcat?有没有办法用 Tomcat 指定不同的会话存储?
【发布时间】:2010-09-10 02:05:42
【问题描述】:

Tomcat(此处为版本 5)将会话信息存储在内存中。集群时,此信息会定期广播到集群中的其他服务器以保持同步。您可以使用数据库存储使会话持久化,但此信息也只是定期写入,并且仅真正用于故障恢复,而不是实际替换内存中的会话。

如果您不想使用粘性会话(很遗憾,我们的配置不允许这样做),则会引发会话不同步的问题。

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

【问题讨论】:

  • 如果您不使用粘性会话,那么您将违反 servlet 规范中的要求之一 - 对同一会话的请求由同一 JVM 提供。 Tomcat 使这非常困难。将会话保存在数据库中可能会导致丢失更新问题。

标签: java tomcat session


【解决方案1】:

肯定有办法的。虽然我强烈支持粘性会话 - 为您的服务器/数据库节省大量负载(除非出现故障)...

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

【讨论】:

    【解决方案2】:

    看看Terracotta,我认为它可以解决您的扩展问题,而无需重新设计重大的应用程序。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 一个 cookie 的空间和数量非常有限,您可以分配。每个域最多 20 个 cookie,每个 cookie 最多 4KB。
      • Rails 如何应对有限的 cookie 大小?
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-10
        • 1970-01-01
        • 1970-01-01
        • 2016-08-27
        • 2013-04-28
        • 2019-10-25
        • 1970-01-01
        相关资源
        最近更新 更多