我正在构建一些应用程序,我必须使用memcached。
我找到了很好的客户:
net.spy.memcached.MemcachedClient
在这种情况下,一切都有效,除了一个 - 我有紧密连接的问题,过了一段时间我开始与内存泄漏作斗争。
我一直在寻找密切连接的可能性,而且我还有“关机”方法。但如果我像这样使用这种方法:
MemcachedClient c = new MemcachedClient(new InetSocketAddress(
memcachedIp, memcachedPort));
c.set(something, sessionLifeTime, memcache.toJSONString());
c.shutdown();
我在添加memcached时遇到问题 - 在日志中我看到这个方法是打开连接,在它向memcached添加任何内容之前,它正在关闭连接。
你有什么想法,该怎么办?
另外 - 我发现方法:c.shutdown(2, TimeUnit.SECONDS);
- 应该在2秒后关闭连接,但我已经将jmx监视器连接到我的tomcat,我看到,Memcached thread
在2秒后没有完成 - 这个线程根本没有完成......
答案 0 :(得分:1)
在向memcached添加内容时遇到问题的原因是set(...)函数是异步的,它所做的就是将该操作放入队列以发送到memcached。由于您在此之后立即调用shutdown,因此操作实际上没有时间将其发送到线路上。您需要调用set(...)。get()以使您的应用程序线程在调用shutdown之前实际等待操作完成。
此外,我没有遇到IO线程在超时调用shutdown后没有死亡。您可以通过使用Spymemached运行独立程序来确认这是一个实际错误的一种方法。如果该过程在完成后没有终止,那么您就发现了一个问题。