MemcachedClient and timeout

Massimo Marazza m.marazza at kataweb.it
Thu Mar 13 16:37:57 UTC 2008


Thank you Henrik for you reply.
I followed your suggestion so I created a class like this (singleton)

public class MemcachedUtilityStatic {
   
    private static MemcachedClient memcachedClient = null;
   
    public synchronized static MemcachedClient getIstance(String 
hostcache) throws Exception{
        if (memcachedClient == null) {
            try {
                memcachedClient = new 
MemcachedClient(AddrUtil.getAddresses(hostcache));
            } catch(Exception e) {
                e.printStackTrace();
          }
        }
        return memcachedClient;
      }
}

and I used this class in my doStartTag method

public int doStartTag() throws JspException {
        try {
           
            String hostcache = 
pageContext.getServletContext().getInitParameter("hostmemcached");
            memcachedClient = MemcachedUtilityStatic.getIstance(hostcache);
             ......
}

Suppose memcached server is up. No problem found when I start the 
context and I request the page, but if
I stop the memcache server then I start it and I request the page, the 
MemcachedClient object is not able to cache
contents.
If I use a different approach in the tag lib, that is create a new 
MemcachedClient object
   
public int doStartTag() throws JspException {
        try {
           
            String hostcache = 
pageContext.getServletContext().getInitParameter("hostmemcached");
            memcachedClient = new 
MemcachedClient(AddrUtil.getAddresses(hostcache));
             ......
}

and if I do a memcached server stop and start, after the restart the 
MemcachedClient is able to cache objects.
For me that's strange...
Maybe the right approach when the memcache server goes down is to 
restart the web container (Tomcat)?

Thanks in advance,

Massimo

Henrik Schröder ha scritto:
> On Thu, Mar 13, 2008 at 12:29 PM, Massimo Marazza 
> <m.marazza at kataweb.it <mailto:m.marazza at kataweb.it>> wrote:
>
>     I'm using a java tag lib that in the doStartTag() method search a
>     value
>     for a given key in the memcached sever. I'm using
>     net.spy.memcached.MemcachedClient
>     and in the doStartTag() code I do something similar this: 
>
>
> If you're using a heavier client with built-in socket pooling and as 
> in SpyMemcached's case, a message queue, you should never create more 
> than one instance, and you should always reuse it. Creating it once 
> every time you need it means that you get the high start-up cost each 
> and every time, and none of the benefits such as pooled sockets. you 
> really, really want to avoid this. I'm sure SpyMemcached keeps track 
> of non-working servers internally, but if you destroy the client after 
> every request, you won't keep this knowledge, and each new request 
> won't discover this until after trying to connect to the non-working 
> server.
>
> Instead, put the client as a static field in some class, and create it 
> in the static initializer for that class, and then re-use that 
> instance everywhere in your code. Something like this:
>
> public class MyLittleCacheClass {
>     public static MemcachedClient Client;
>     static() {
>         string hostcache = "myserver1:11211";
>         Client = new MemcachedClient(AddrUtil.getAddresses(hostcache));
>         //Add any further config settings here...
>     }
> }
>
> ...and then you do
>
> Future<Object> f = MyLittleCacheClass.Client.asyncGet(mykey.toString());
> [...]
>
> when you want to use it like in your example.
>
>
> /Henrik Schröder - apologies for any incorrect Java, I'm a little rusty.


More information about the memcached mailing list