在Google中搜索memcached Java,第一个结果是Using Memcached with Java。
这个家伙(自称为Internet上的随机混蛋!)基于net.spy.memcached提出了一个Singleton。它基本上通过创建20个MemcachedClient实例来创建20个线程和连接。对于每个请求,它都会随机选择一个。
但是,这些线程和连接永远不会关闭,并且每次在开发过程中热交换应用程序时它们就会堆积(带有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(带有清除代码)的方法是否正确,还是更好地以其他方式重新开始?
最佳答案
我认为创建20个内存缓存客户端是很愚蠢的-就像创建数据库连接池的20个单独副本一样。该客户端的想法是它将多种请求与异步IO复用。
http://code.google.com/p/spymemcached/wiki/Optimizations
至于关闭它,只需调用:
yourClient.shutdown()立即关闭,或
例如,请使用yourClient.shutdown(3,TimeUnit.SECONDS),以便有一些时间进行更正常的关闭。
可以从Servlet的.destroy方法或整个WAR的上下文侦听器中调用该方法。