我有一个关于 Tomcat / jBOSS 和其他 java 应用程序服务器的问题。会话(会话数据)存储在哪里?
默认情况下,我会说在内存中。细节实际上是......特定于应用程序服务器的实现细节。
在 PHP 中,会话通常存储在数据库中,这意味着您可以在负载平衡的环境中轻松共享会话数据。在 Tomcat 和其他应用程序服务器中,会话似乎默认存储在内存中,这不适用于负载平衡环境。
嗯,不完全是。这意味着客户端请求必须发送到集群环境中的同一节点(这称为“会话粘性”),从负载平衡的角度来看,这不是问题。但从故障转移的角度来看,这是一个问题:如果集群中的某个节点发生故障,则该节点管理的会话状态可能会丢失。为了解决这个问题,几乎所有的应用服务器提供商都实现了会话故障转移(使用各种机制,例如内存复制、基于 JDBC 的持久性等)。但是,同样,实现细节是特定于应用服务器的。例如,请参阅Tomcat或WebLogic如何处理该问题。The Server Side 上的Under the Hood of J2EE Clustering文章也是一本非常有趣的读物。
虽然 PHP 确实默认将会话存储在文件中,但需要几行代码才能将其连接到数据库。应用服务器也是如此吗?
正如我所说,并非所有应用程序服务器都会提供基于 JDBC 的持久性。话虽如此,为了回答您的问题,配置通常很简单。但是使用数据库确实不是首选的解决方案(实际上,我不惜一切代价避免它)。
基本上,在记忆中讲故事的优点是什么?这仍然是应用程序服务器的标准做法吗?
很简单:性能!序列化数据、调用数据库、写入磁盘,所有这些都是有代价的。内存复制显然可以避免一些开销。但它也有一些限制。例如,它不允许使用 WebLogic进行WAN HTTP 会话状态复制。但是好吧,只有少数人需要这个:)