MongoDB查询字段没有创建索引导致的连接超时异常解案例分享
今天在现场的哥们发来异常,让我解决,错误信息如下:
HTTPStatus500-Readoperationtoserver192.168.1.110:20001failedondatabasewpdb;nestedexceptioniscom.mongodb.MongoException$Network:Readoperationtoserver192.168.1.110:20001failedondatabasewpdb -------------------------------------------------------------------------------- typeExceptionreport messageReadoperationtoserver192.168.1.110:20001failedondatabasewpdb;nestedexceptioniscom.mongodb.MongoException$Network:Readoperationtoserver192.168.1.110:20001failedondatabasewpdb descriptionTheserverencounteredaninternalerrorthatpreventeditfromfulfillingthisrequest. exception org.springframework.dao.DataAccessResourceFailureException:Readoperationtoserver192.168.1.110:20001failedondatabasewpdb;nestedexceptioniscom.mongodb.MongoException$Network:Readoperationtoserver192.168.1.110:20001failedondatabasewpdb org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:56) org.springframework.data.mongodb.core.MongoTemplate.potentiallyConvertRuntimeException(MongoTemplate.java:1913) org.springframework.data.mongodb.core.MongoTemplate.executeFindOneInternal(MongoTemplate.java:1743) org.springframework.data.mongodb.core.MongoTemplate.doFindOne(MongoTemplate.java:1557) org.springframework.data.mongodb.core.MongoTemplate.findOne(MongoTemplate.java:497) com.geoway.ime.tile.dao.impl.TileDaoImpl.getTile(TileDaoImpl.java:60) com.geoway.ime.tile.service.impl.TileServiceImpl.getTile(TileServiceImpl.java:105) sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597) org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) org.springframework.cache.interceptor.CacheInterceptor$1.invoke(CacheInterceptor.java:58) org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:211) org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:66) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) com.sun.proxy.$Proxy50.getTile(UnknownSource) com.geoway.ime.server.rest.TileServer.getTileKVP(TileServer.java:60) sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597) com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60) com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185) com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302) com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1511) com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1442) com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1391) com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1381) com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538) com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716) javax.servlet.http.HttpServlet.service(HttpServlet.java:723) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106) rootcause com.mongodb.MongoException$Network:Readoperationtoserver192.168.1.110:20001failedondatabasewpdb com.mongodb.DBTCPConnector.innerCall(DBTCPConnector.java:308) com.mongodb.DBTCPConnector.call(DBTCPConnector.java:279) com.mongodb.DBCollectionImpl.find(DBCollectionImpl.java:84) com.mongodb.DBCollectionImpl.find(DBCollectionImpl.java:66) com.mongodb.DBCollection.findOne(DBCollection.java:870) com.mongodb.DBCollection.findOne(DBCollection.java:844) com.mongodb.DBCollection.findOne(DBCollection.java:790) org.springframework.data.mongodb.core.MongoTemplate$FindOneCallback.doInCollection(MongoTemplate.java:1980) org.springframework.data.mongodb.core.MongoTemplate$FindOneCallback.doInCollection(MongoTemplate.java:1965) org.springframework.data.mongodb.core.MongoTemplate.executeFindOneInternal(MongoTemplate.java:1739) org.springframework.data.mongodb.core.MongoTemplate.doFindOne(MongoTemplate.java:1557) org.springframework.data.mongodb.core.MongoTemplate.findOne(MongoTemplate.java:497) com.geoway.ime.tile.dao.impl.TileDaoImpl.getTile(TileDaoImpl.java:60) com.geoway.ime.tile.service.impl.TileServiceImpl.getTile(TileServiceImpl.java:105) sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597) org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) org.springframework.cache.interceptor.CacheInterceptor$1.invoke(CacheInterceptor.java:58) org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:211) org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:66) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) com.sun.proxy.$Proxy50.getTile(UnknownSource) com.geoway.ime.server.rest.TileServer.getTileKVP(TileServer.java:60) sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597) com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60) com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185) com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302) com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1511) com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1442) com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1391) com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1381) com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538) com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716) javax.servlet.http.HttpServlet.service(HttpServlet.java:723) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106) rootcause java.net.SocketTimeoutException:Readtimedout java.net.SocketInputStream.socketRead0(NativeMethod) java.net.SocketInputStream.read(SocketInputStream.java:129) java.io.BufferedInputStream.fill(BufferedInputStream.java:218) java.io.BufferedInputStream.read1(BufferedInputStream.java:258) java.io.BufferedInputStream.read(BufferedInputStream.java:317) org.bson.io.Bits.readFully(Bits.java:48) org.bson.io.Bits.readFully(Bits.java:35) org.bson.io.Bits.readFully(Bits.java:30) com.mongodb.Response.<init>(Response.java:42) com.mongodb.DBPort$1.execute(DBPort.java:141) com.mongodb.DBPort$1.execute(DBPort.java:135) com.mongodb.DBPort.doOperation(DBPort.java:164) com.mongodb.DBPort.call(DBPort.java:135) com.mongodb.DBTCPConnector.innerCall(DBTCPConnector.java:300) com.mongodb.DBTCPConnector.call(DBTCPConnector.java:279) com.mongodb.DBCollectionImpl.find(DBCollectionImpl.java:84) com.mongodb.DBCollectionImpl.find(DBCollectionImpl.java:66) com.mongodb.DBCollection.findOne(DBCollection.java:870) com.mongodb.DBCollection.findOne(DBCollection.java:844) com.mongodb.DBCollection.findOne(DBCollection.java:790) org.springframework.data.mongodb.core.MongoTemplate$FindOneCallback.doInCollection(MongoTemplate.java:1980) org.springframework.data.mongodb.core.MongoTemplate$FindOneCallback.doInCollection(MongoTemplate.java:1965) org.springframework.data.mongodb.core.MongoTemplate.executeFindOneInternal(MongoTemplate.java:1739) org.springframework.data.mongodb.core.MongoTemplate.doFindOne(MongoTemplate.java:1557) org.springframework.data.mongodb.core.MongoTemplate.findOne(MongoTemplate.java:497) com.geoway.ime.tile.dao.impl.TileDaoImpl.getTile(TileDaoImpl.java:60) com.geoway.ime.tile.service.impl.TileServiceImpl.getTile(TileServiceImpl.java:105) sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597) org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) org.springframework.cache.interceptor.CacheInterceptor$1.invoke(CacheInterceptor.java:58) org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:211) org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:66) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) com.sun.proxy.$Proxy50.getTile(UnknownSource) com.geoway.ime.server.rest.TileServer.getTileKVP(TileServer.java:60) sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597) com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60) com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185) com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302) com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1511) com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1442) com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1391) com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1381) com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538) com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716) javax.servlet.http.HttpServlet.service(HttpServlet.java:723) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106) noteThefullstacktraceoftherootcauseisavailableintheApacheTomcat/6.0.41logs.
由异常来看,是由于MongoDB连接超时造成的。于是,往MongoDB上找原因。首先上MongoDB的配置文件:
mongodb.replica-set=192.98.12.242:30007,192.98.12.245:30007 mongodb.hostname=192.98.12.245 mongodb.port=30007 mongodb.connections-per-host=1000 mongodb.threads-allowed-to-block-for-connection-multiplier=200 mongodb.connect-timeout=2000 mongodb.max-wait-time=2000 mongodb.auto-connect-retry=true mongodb.socket-keep-alive=true mongodb.socket-timeout=1500 mongodb.slave-ok=true mongodb.write-number=1 mongodb.write-timeout=1000 mongodb.write-fsync=true mongodb.dbname=shardvectordb mongodb.dbuser= mongodb.dbpassword=
连接时间2秒。然后在定位mongodb的查询,结果为6、7秒。原来是这个原因。然后定位,一个查询为什么耗时那么久呢?
经过排查,原来是查询字段没有创建索引。然后把索引创建,查询几十毫秒,ok问题全部解决。