前言:我不是Java开发人员。
我对Tomcat / jBOSS和其他java应用程序服务器有疑问。会话(会话数据)存储在哪里?在PHP中,会话通常存储在数据库中,这意味着您可以在负载平衡环境中轻松共享会话数据。在Tomcat和其他应用程序服务器中,默认情况下会话似乎存储在内存中,这不适用于负载平衡环境。虽然PHP默认情况下会将会话存储在文件中,但需要几行才能将其连接到数据库。应用服务器也是如此吗?
基本上,记忆中的故事会有什么优点?这仍然是应用服务器的标准做法吗?谢谢大家!
答案 0 :(得分:14)
我对Tomcat / jBOSS和其他java应用程序服务器有疑问。会话(会话数据)存储在哪里?
默认情况下,我会在记忆中说。细节实际上是......应用服务器特定的实现细节。
在PHP中,会话通常存储在数据库中,这意味着您可以在负载平衡的环境中轻松共享会话数据。在Tomcat和其他应用程序服务器中,默认情况下会话似乎存储在内存中,这不适用于负载平衡环境。
嗯,不完全是。这意味着客户端请求必须被发送到集群环境中的同一节点(这被称为“会话粘性”),从负载平衡的角度来看,这不是问题。但从故障转移的角度来看,这是一个问题:如果群集中的节点发生故障,节点管理的会话状态可能会丢失。为解决此问题,几乎所有应用程序服务器提供程序都实现会话故障转移(使用各种机制,如内存中复制,基于JDBC的持久性等)。但是,实现细节再次是特定于应用程序服务器的。例如,请参阅Tomcat或WebLogic如何处理该问题。服务器端的Under the Hood of J2EE Clustering文章也非常有趣。
虽然PHP默认情况下会将会话存储在文件中,但需要几行才能将其连接到数据库。应用服务器也是如此吗?
正如我所说,并非所有应用程序服务器都提供基于JDBC的持久性。说完了,回答你的问题,配置一般都很简单。但是使用数据库确实不是首选解决方案(实际上,我不惜一切代价避免使用它)。
基本上,记忆中的故事会有什么优点?这仍然是应用服务器的标准做法吗?
简单地说:表现!序列化数据,调用数据库,写入磁盘,所有这些都需要付出代价。内存中复制显然可以避免一些开销。但它也有一些限制。例如,它不允许WAN HTTP Session State Replication使用WebLogic。但是,只有少数人需要这个:)
答案 1 :(得分:3)
使用提供的会话管理器,会话始终在内存中,但它有一个管理器将会话持久保存到JDBC存储,
http://tomcat.apache.org/tomcat-5.5-doc/config/manager.html
与PHP不同,会话仍然可以从内存访问,并且只有在达到内存限制或服务器关闭时才会持久保存到DB。因此,您的负载均衡器必须具有粘性路由才能使其正常工作。
内存中会话的好处是性能,因为每次事务都不会发生db访问。
您可以编写自己的会话管理器来模拟PHP行为。
答案 2 :(得分:1)
JavaEE规范没有规定这一点,需要由各个实现来决定。例如,在Tomcat中处理负载平衡的常用方法是使用replicated sessions,其中会话数据在节点之间进行多播。在数据库中存储会话数据是一个巨大的性能杀手,虽然Tomcat可能会支持它,但我真的不推荐它。