Как кэшировать соединение Memcached с помощью клиента java spymemcached

Я изучаю, как кэшировать объекты с помощью memcached с клиентом spymemcached из примеров spymemcached

MemcachedClient c=new MemcachedClient(new InetSocketAddress("hostname", portNum));    
// Store a value (async) for one hour
c.set("someKey", 3600, someObject);
// Retrieve a value (synchronously).
Object myObject=c.get("someKey");

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

Мой вопрос: как мне кэшировать это соединение? Может кто-нибудь, пожалуйста, дайте мне пример, с которого я могу начать. Если вам интересно, что я пробовал, я пытался поместить свое соединение в memcached, но потом понял, что мне нужно создать соединение, чтобы получить его. :)

Заранее спасибо.


person qualebs    schedule 12.08.2013    source источник


Ответы (3)


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

Не делайте этого; spymemcache использует одно соединение для ВСЕХ операций ввода/вывода в memcache и обратно; все делается асинхронно; из документации spymemcache...

Каждый экземпляр MemcachedClient устанавливает и поддерживает одно соединение с каждым сервером в вашем кластере.

Просто выполните следующее один раз в своем приложении; убедитесь, что клиент доступен для других служб в вашем приложении, чтобы они могли получить к нему доступ.

MemcachedClient memClient = new MemcachedClient(new InetSocketAddress(host, port)); 

Используйте memClient для ввода/вывода с memcache; нет необходимости каждый раз создавать новый экземпляр MemcachedClient; Выполнено. По указанной вами ссылке есть ответы на все ваши вопросы.

Каково ваше развертывание? веб-приложение или автономный?

person raffian    schedule 12.08.2013
comment
Я развертываю веб-приложение. Я должен создать соединение в методе init() моего сервлета, а затем передать его другим классам, правильно ли это? - person qualebs; 14.08.2013
comment
Я решил проблему сейчас, и я публикую ответ. Спасибо за указание мне в правильном направлении. - person qualebs; 14.08.2013

Это просто означает, что вы должны использовать повторное использование соединений, которые вы открываете, а не открывать соединение для каждого запроса. Не имеет смысла хранить экземпляр соединения в memcached.

Кэширование соединения в случае означает кэширование его в вашем приложении (сохранение его в памяти и открытие), а не фактическое сохранение соединения в memcached.

person mikewied    schedule 12.08.2013
comment
Но это не совсем ответ на мой вопрос. This just means that you should use reuse the connections that you open as opposed to opening a connection for each request. It doesn't make sense to store a connection instance in memcached. ты просто перефразировал это. - person qualebs; 14.08.2013

Я провел еще немного исследований и наткнулся на этот вопрос Затем я придумал свое решение:

сначала создал contextlistener

public class ContextListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        Memcached.createClient();
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
    }

}

затем я добавил прослушиватель в дескриптор развертывания, добавив эти строки в web.xml

<listener>
    <description>Used with memcached to initialize connection</description>
    <listener-class>com.qualebs.managers.ContextListener</listener-class>
</listener>

Я создал класс Memcached и добавил эти методы

    static void createClient() {
        try {
            client = new MemcachedClient(new InetSocketAddress("localhost", 11211));
        } catch (IOException ex) {
            Logger.getLogger(Memcached.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
        }
    }

    static MemcachedClient getClient() throws IOException {
        return client;
    }

Теперь везде, где мне нужно использовать memcached-соединение, просто вызовите Memcached.getClient(). Я надеюсь, что это поможет кому-то еще с тем же вопросом.

person qualebs    schedule 14.08.2013