Tomcat / jBOSS 会话 - 它们通常存储在哪里?

Posted

技术标签:

【中文标题】Tomcat / jBOSS 会话 - 它们通常存储在哪里?【英文标题】:Tomcat / jBOSS sessions - where are they usually stored? 【发布时间】:2010-12-27 16:20:53 【问题描述】:

前言:我不是java开发者。

我有一个关于 Tomcat/jBOSS 和其他 java 应用服务器的问题。会话(会话数据)存储在哪里?在 php 中,会话通常存储在数据库中,这意味着您可以在负载平衡的环境中轻松共享会话数据。在 Tomcat 和其他应用程序服务器中,会话似乎默认存储在内存中,这不适用于负载平衡环境。虽然 PHP 确实默认将会话存储在文件中,但需要几行代码才能将其连接到数据库。应用服务器也是如此吗?

基本上,在记忆中讲故事的优点是什么?这仍然是应用程序服务器的标准做法吗?谢谢大家!

【问题讨论】:

【参考方案1】:

JavaEE 规范没有规定这一点,由各个实现来决定。例如,在 Tomcat 中处理负载平衡的常用方法是使用replicated sessions,其中会话数据在节点之间进行多播。在数据库中存储会话数据是一个巨大的性能杀手,虽然 Tomcat 可能支持它,但我真的不推荐它。

【讨论】:

谢谢。我看到复制会话有三种方法(文件、JDBC 和内存中)。那么文件/内存是最常见的吗?我认为我的问题是我真的不明白“应用程序服务器”的含义。我需要做更多的阅读。 我很想阅读“在数据库中存储会话数据是一个巨大的性能杀手”语句背后的一些数据,有什么参考吗? (不是贬低,感兴趣。)我希望它在很大程度上取决于所涉及的基础设施。 @TJ:应用程序通常会在其会话中存储大量高度结构化、高度易变的数据,以可扩展的方式在数据库中保存这些数据可能会非常昂贵。如果您将应用程序从内存中移动到数据库中的会话持久性,则通常会降低性能。网络复制的内存中会话在很大程度上解决了这个问题,因为虽然执行复制会降低性能,但通常不如数据库持久性那么明显。【参考方案2】:

使用提供的会话管理器,会话始终在内存中,但它有一个管理器将会话持久保存到 JDBC 存储中,

http://tomcat.apache.org/tomcat-5.5-doc/config/manager.html

与 PHP 不同,会话仍然从内存中访问,并且仅在达到内存限制或服务器关闭时才会持久保存到 DB。所以你的负载均衡器必须有粘性路由才能工作。

内存中会话的好处是性能,因为并非每个事务都进行数据库访问。

您可以编写自己的会话管理器来模拟 PHP 行为。

【讨论】:

【参考方案3】:

我有一个关于 Tomcat/jBOSS 和其他 java 应用服务器的问题。会话(会话数据)存储在哪里?

默认情况下,我会说在内存中。细节实际上是......特定于应用程序服务器的实现细节。

在 PHP 中,会话通常存储在数据库中,这意味着您可以在负载平衡的环境中轻松共享会话数据。在 Tomcat 和其他应用服务器中,会话似乎默认存储在内存中,这不适用于负载平衡环境。

嗯,不完全是。这意味着客户端请求必须发送到集群环境中的同一节点(这称为“会话粘性”),从负载平衡的角度来看,这不是问题。但从故障转移的角度来看,这是一个问题:如果集群中的某个节点发生故障,该节点管理的会话状态可能会丢失。为了解决这个问题,几乎所有的应用服务器提供商都实现了会话故障转移(使用各种机制,例如内存复制、基于 JDBC 的持久性等)。但是,同样,实现细节是特定于应用服务器的。例如,请参阅 Tomcat 或 WebLogic 如何处理该问题。服务器端上的Under the Hood of J2EE Clustering 文章也是一篇非常有趣的读物。

虽然 PHP 在默认情况下确实将会话存储在文件中,但需要几行代码才能将其连接到数据库。应用服务器也是如此吗?

正如我所说,并非所有应用程序服务器都会提供基于 JDBC 的持久性。话虽如此,为了回答您的问题,配置通常很简单。但是使用数据库确实不是首选的解决方案(实际上,我不惜一切代价避免使用它)。

基本上,在记忆中讲故事的优点是什么?这仍然是应用程序服务器的标准做法吗?

简单地说:性能!序列化数据、调用数据库、写入磁盘,所有这些都是有代价的。内存复制显然可以避免一些开销。但它也有一些限制。例如,它不允许 WAN HTTP Session State Replication 使用 WebLogic。但好吧,只有少数人需要这个:)

【讨论】:

这非常有帮助。谢谢。 @frio80 不客气!顺便说一句,识别一个好的答案的常用方法是支持它;-)

以上是关于Tomcat / jBOSS 会话 - 它们通常存储在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

JBoss 和单独的 TomCat 在同一台机器上

jboss-as-7.1.0.CR1b域集群和会话复制环境部署

两个 java 应用程序之间的通信在 JBoss 7.0 中正常工作,但在 Tomcat 8.5 中不工作

如何使用 JBoss Wildfly 查询活动会话数?

jboss_cli 活动会话详细信息 [关闭]

JBoss和tomcat的区别