Сессии Tomcat истекает неожиданно - PullRequest
13 голосов
/ 06 июня 2009

Мы используем сервер приложений tomcat, который обрабатывает более 100 одновременных сеансов. За последние 2 месяца наиболее активные пользователи заметили, что иногда их выгнали из системы.

Как я понял из журнала, сеансы tomcat истекают без какой-либо причины.

Не вижу проблем со стороны веб-приложения. Есть ли проблемы со стороны кота?

Tomcat 6.0.18.

Ответы [ 9 ]

8 голосов
/ 06 июня 2009

Если бы не было никакого шанса кода, вызывающего это, я бы посмотрел на использование памяти. Это может быть следствием нехватки памяти Tomcat и отмены сеансов для восстановления.

Если это вообще возможно, отслеживать сборку мусора и / или включать наблюдение с помощью jconsole или jvisualvm.

7 голосов
/ 24 июля 2009

Возможная причина в том, что вы помещаете в сеанс объект, который НЕ реализует интерфейс Serializable. Tomcat иногда записывает некоторые сессии на диск. Если сеанс содержит несериализуемые объекты, он будет просто удален из контейнера (из-за исключения NotSerializableException). Если это происходит, вы должны увидеть Исключение в файле журнала tomcat.

4 голосов
/ 08 июня 2009

Я бы увеличил мониторинг сервера в целом и сессий конкретно.

Хорошим приложением для мониторинга является лямбда-зонд - оно позволяет просматривать текущие сеансы и их данные. Я также добавил бы HttpSessionListener для регистрации создания и уничтожения сессии.

Редактировать

Возможно ли, что вы добавите некоторые не сериализуемые объекты в сеанс, и Tomcat не сможет пассивировать их на диск?

Редактировать 2

Кажется, что лямбда-зонд мертв, и есть гораздо лучший вариант проекта на http://code.google.com/p/psi-probe/

2 голосов
/ 21 декабря 2010

Я видел похожие проблемы, когда существуют следующие предпосылки:

  • несколько экземпляров приложения tomcat установлены на нескольких JVM
  • балансировка нагрузки (между веб-сервером и JVM Tomcat) настроена неправильно.
  • Функция репликации сеанса Tomcat не включена

Из-за неправильной конфигурации балансировки нагрузки веб-сервер может произвольно решить разорвать привязку к сеансу и отправить входящий запрос JVM Tomcat, который никогда не видел сеанс раньше. JVM Tomcat выпустит новый сеанс, и пользователь потеряет все свои данные предыдущего сеанса и начнет работу заново.

2 голосов
/ 30 июля 2010

Мы только что столкнулись с этим с tomcat 6_0_18 и IBM 1.5 JVM

оказывается, что это проблема IBM JVM с атомарными операциями.

Существует исправление в котах больше 6_0_19, чтобы справиться с этим.

Это также не происходит на солнце 1,5 JVM

вот некоторые подробности

Дело кота Багзиллы

2 голосов
/ 07 июня 2009

Увеличьте запись сеансов, что может пролить свет на вашу проблему.

Страница конфигурации Tomcat Регистрация в Tomcat включает в себя пример увеличения регистрации сеансов.

2 голосов
/ 06 июня 2009

есть время ожидания, которое вы можете настроить в своем файле web.xml:

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

используйте -1 без таймаута

0 голосов
/ 08 июня 2009

Вы можете искать в базе данных ошибок Tomcat, но было бы лучше сначала взглянуть на ваше веб-приложение. Вероятность того, что с Tomcat что-то не так, очень мала.

Попробуйте выяснить, что вызывает недействительность сеанса. Вы используете фильтры? У вас есть кросс-контекстные запросы? Попробуйте добавить информацию журнала для каждого запроса, чтобы выяснить, когда именно сеанс потерян.

0 голосов
/ 06 июня 2009

Несмотря на то, что я не знаю причину проблемы, одно из возможных исправлений (которое я делал в моем предыдущем проекте) состояло в том, чтобы запустить приложение в кластере Tomcat и иметь аварийное переключение сеанса. Сеансы по умолчанию могут быть прикрепленными, и когда один из узлов выходит из строя, исправные узлы принимают сеансы, и все это прозрачно для конечного пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...