使用java SDK测试memcache的并发读取时,每次读取都建立一个连接,读取完后关闭。并发测试时,均会报错,如下,请问是什么原因?
2017-05-31 15:34:25.097 WARN net.spy.memcached.protocol.binary.BinaryMemcachedNodeImpl: Operation canceled because authentication or reconnection and authentication has taken more than one second to complete.
java.lang.RuntimeException: Exception waiting for value
at net.spy.memcached.MemcachedClient.get(MemcachedClient.java:1007)
at net.spy.memcached.MemcachedClient.get(MemcachedClient.java:1024)
at cci.com.hk.company500.memcache.GetCompareCompanys4China.doPost(GetCompareCompanys4China.java:60)
at cci.com.hk.company500.memcache.GetCompareCompanys4China.doGet(GetCompareCompanys4China.java:26)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:475)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:498)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:796)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1366)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.util.concurrent.ExecutionException: java.lang.RuntimeException: Cancelled
at net.spy.memcached.internal.OperationFuture.get(OperationFuture.java:169)
at net.spy.memcached.internal.GetFuture.get(GetFuture.java:62)
at net.spy.memcached.MemcachedClient.get(MemcachedClient.java:1003)
... 27 more
Caused by: java.lang.RuntimeException: Cancelled
... 30 more
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您提供的错误信息,问题可能出在客户端与Memcached服务器之间的认证或重新连接过程中超时。具体来说,错误提示“Operation canceled because authentication or reconnection and authentication has taken more than one second to complete”表明在尝试进行操作时,因为认证或因网络问题需要重连并且完成这个过程花费超过了1秒,导致操作被取消。
针对这个问题,您可以尝试以下几个解决方案:
增加连接超时时间:在初始化MemcachedClient
时,可以设置更长的连接超时时间,以应对网络延迟或服务器响应慢的情况。例如,可以通过ConnectionFactoryBuilder
来设置连接和操作的超时时间。
ConnectionFactoryBuilder builder = new ConnectionFactoryBuilder();
builder.setOpTimeout(5, TimeUnit.SECONDS); // 设置操作超时时间
builder.setConnectTimeout(5, TimeUnit.SECONDS); // 设置连接超时时间
MemcachedClient mcc = new MemcachedClient(builder.build(), AddrUtil.getAddresses("localhost:11211"));
使用连接池:频繁地创建和销毁连接是低效且可能导致问题的,尤其是在高并发场景下。考虑使用连接池来管理连接,这样可以复用连接,减少建立和销毁连接的开销。SpyMemcached库本身不直接提供连接池功能,但你可以通过控制客户端实例的生命周期来模拟连接池的效果,或者寻找支持连接池的其他客户端库。
优化认证流程:如果您的Memcached服务配置了认证,确保认证过程高效且正确配置。检查认证信息是否正确传递给客户端,并确认服务器端的认证配置是否匹配。
检查网络状况:网络延迟或不稳定也可能导致连接和认证超时。检查客户端与Memcached服务器之间的网络连接,确保没有明显的网络问题。
异步操作:考虑使用异步API来处理读取操作,这样即使单个操作遇到延迟或失败,也不会阻塞其他操作,从而提高整体的并发处理能力。
如果以上方法都不能解决问题,建议查看Memcached服务器的日志,以获取更详细的错误信息,这有助于进一步定位问题所在。同时,确认Memcached服务器的配置(如最大连接数、超时设置等)是否适合当前的并发需求。