我们正在运行处理超过100个并发会话的tomcat应用程序服务器。 在过去的两个月中,最活跃的用户注意到他们有时会从系统中被踢出。
据我所知,日志tomcat会话没有任何理由过期。
我认为Web应用程序方面没有任何问题。 tomcat方面有什么问题吗?
Tomcat 6.0.18。
答案 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
这里有一些更多细节
答案 6 :(得分:2)
当存在以下先决条件时,我看到了类似的问题:
由于负载均衡配置不正确,Web服务器可能会随机决定中断会话关联,并将传入请求发送到之前从未见过会话的Tomcat JVM。 Tomcat JVM将发出一个新会话,用户将丢失所有先前的会话数据并有效地重新开始。
答案 7 :(得分:0)
您可以搜索Tomcat的错误数据库,但最好再次查看您的Web应用程序。 Tomcat出现问题的可能性非常低。
尝试调查导致会话失效的原因。你在使用过滤器吗?你有跨上下文请求吗?尝试为每个请求添加日志记录信息,以确定何时会话丢失。
答案 8 :(得分:-1)
虽然我不知道问题的原因,但是一个可能的修复(我在之前的项目中已经完成)将是在tomcat集群上运行应用程序并进行会话故障转移。默认情况下,会话可以是粘性的,当一个节点关闭时,健康节点会选择会话,这一切对最终用户都是透明的。