Как интегрировать memcached в сервлет? Tomcat и утечки памяти - PullRequest
1 голос
/ 18 мая 2011

Поиск по memcached java в google, первый результат - Использование Memcached с Java .

Парень (который называет себя Просто какой-то случайный мудак в Интернете! ) предлагает Singleton на основе net.spy.memcached .Он в основном создает 20 потоков и соединений, создавая 20 экземпляров MemcachedClient.Для каждого запроса он выбирает один случайным образом.

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

SEVERE: The web application [/MyAppName] appears to have started a thread named
[...] but has failed to stop it. This is very likely to create a memory leak.

Глядя на MemcachedClient JavaDoc, я вижу метод, называемый shutdown , с единственным описанием «Немедленное выключение».Отключить что?Клиент?Сервер?Я полагаю, что это клиент, так как он находится в MemcachedClient, и я предполагаю, что этот метод закроет соединение и завершит поток. РЕДАКТИРОВАТЬ : да, он отключает клиента.

Вопрос 1 Как принудительно выполнить код очистки в Tomcat 7, прежде чем приложение будет заменено в «горячем» режиме?

Вопрос 2 Является ли этот подход использования memcached (с кодом очистки) корректным или лучше начать заново?

Ответы [ 3 ]

2 голосов
/ 28 июля 2012

Я думаю, что создавать 20 клиентов memcache глупо - это все равно, что создавать 20 отдельных копий вашего пула соединений с БД. Идея этого клиента заключается в том, что он мультиплексирует различные запросы с асинхронным вводом-выводом. http://code.google.com/p/spymemcached/wiki/Optimizations

Что касается выключения, просто позвоните: yourClient.shutdown () для немедленного выключения или например, yourClient.shutdown (3, TimeUnit.SECONDS), чтобы дать время для более плавного завершения работы.

Это можно вызвать из метода .destroy вашего сервлета или из прослушивателя контекста для всей вашей WAR.

1 голос
/ 18 мая 2011

Я ничего не знаю о memcached, но вы, вероятно, могли бы написать пользовательский прослушиватель контекста и вставить в слушатель контекста какую-то ловушку отключения, чтобы при закрытии контекста вы могли проходить по элементам в вашем синглтоне и закрывать ихвниз.

0 голосов
/ 25 июня 2011

Оказалось, что это ошибка Java AWS SDK, не связанная с memcached. В версии 1.2.2 Java AWS SDK эта ошибка исправлена.

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