2

前言:我不是java开发者。

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

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

4

3 回答 3

15

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

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

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

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

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

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

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

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

于 2009-12-17T18:23:24.283 回答
3

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

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

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

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

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

于 2009-12-17T16:20:15.720 回答
1

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

于 2009-12-17T14:14:23.897 回答