Tomcat会话意外到期

时间:2009-06-06 07:23:53

标签: java session tomcat

我们正在运行处理超过100个并发会话的tomcat应用程序服务器。 在过去的两个月中,最活跃的用户注意到他们有时会从系统中被踢出。

据我所知,日志tomcat会话没有任何理由过期。

我认为Web应用程序方面没有任何问题。 tomcat方面有什么问题吗?

Tomcat 6.0.18。

9 个答案:

答案 0 :(得分:8)

如果没有代码机会触发这个,我会看一下内存使用情况。此可能是Tomcat耗尽内存并使会话无效以进行恢复的效果。

如果在所有可能的情况下监视垃圾收集,和/或使用jconsole或jvisualvm进行监视。

答案 1 :(得分:7)

可能的原因是您在会话中放入了一个不实现Serializable接口的对象。 Tomcat偶尔会在磁盘上写一些会话。如果一个会话包含不可序列化的对象,它将被简单地从容器中删除(因为NotSerializableException)。如果发生这种情况,您应该在tomcat日志文件中看到Exception。

答案 2 :(得分:4)

我会特别增加对服务器和会话的监控。

一个好的监控应用程序是lambda probe - 它允许您查看当前会话及其数据。我还会添加HttpSessionListener来记录会话创建和销毁。

修改

是否有可能在会话中添加一些非可序列化的对象,而Tomcat无法将它们钝化到磁盘上?

修改2

Lambda探测器似乎已经死了,在http://code.google.com/p/psi-probe/

上有一个更好的项目分支

答案 3 :(得分:2)

超时,您可以在web.xml中配置:

<web-app>
  ...
  <session-config>
    <session-timeout>-1</session-timeout> 
  </session-config>
</web-app>

使用-1表示没有超时

答案 4 :(得分:2)

增加会话记录,这可能会解决您的问题。

Tomcat配置页面的Logging in Tomcat包含一个增加会话记录的示例。

答案 5 :(得分:2)

我们刚刚遇到tomcat 6_0_18和ibm 1.5 jvm

结果证明这是一个原子操作的ibm jvm问题。

在大于6_0_19的tomcats中有一个修复来处理它。

它也不会发生在太阳1.5 jvm

这里有一些更多细节

tomcat bugzilla case

答案 6 :(得分:2)

当存在以下先决条件时,我看到了类似的问题:

  • 跨多个JVM安装了多个tomcat应用程序实例
  • 未正确配置负载平衡(Web服务器和Tomcat JVM之间)。
  • Tomcat的会话复制功能启用

由于负载均衡配置不正确,Web服务器可能会随机决定中断会话关联,并将传入请求发送到之前从未见过会话的Tomcat JVM。 Tomcat JVM将发出一个新会话,用户将丢失所有先前的会话数据并有效地重新开始。

答案 7 :(得分:0)

您可以搜索Tomcat的错误数据库,但最好再次查看您的Web应用程序。 Tomcat出现问题的可能性非常低。

尝试调查导致会话失效的原因。你在使用过滤器吗?你有跨上下文请求吗?尝试为每个请求添加日志记录信息,以确定何时会话丢失。

答案 8 :(得分:-1)

虽然我不知道问题的原因,但是一个可能的修复(我在之前的项目中已经完成)将是在tomcat集群上运行应用程序并进行会话故障转移。默认情况下,会话可以是粘性的,当一个节点关闭时,健康节点会选择会话,这一切对最终用户都是透明的。