当前位置: 首页 > 科技观察

MongoDB查询超时异常的原因及解决方法

时间:2023-03-12 13:33:28 科技观察

是对超过百万条记录的集合进行聚合操作。DBObjectmatch=(DBObject)JSON.parse("{$match:{logType:{'$in':[5,9]}}}");DBObjectgroup=(DBObject)JSON.parse("{$group:{'_id':'$domainUrl','count':{'$sum':1}}}");AggregationOutputoutput=logCollection.aggregate(匹配,组);偶尔会出现读取超时异常。com.mongodb.MongoException$Network:Readoperationtoserver/192.168.10.202:27017failedondatabaseadLogTableatcom.mongodb.DBTCPConnector.innerCall(DBTCPConnector.java:253)atcom.mongodb.DB.command(DB.java:261)atcom.mongodb.DB.command(DB.java:243)...Causedby:java.net.SocketTimeoutException:Readtimedoutatjava.net.SocketInputStream.socketRead0(NativeMethod)atjava.net.SocketInputStream.read(SocketInputStream.java:152)通过多次测试,发现一个进行聚合平均时间为5s,超过5s会报错!然后查看MongoDB的配置信息:socket-timeout="5000"//5socket-timeout默认配置为0,即没有限制。没有超时限制,如果系统有问题也不容易发现。应根据实际情况给出合理的超时时间。通过多次测试,发现最长的执行时间是6秒,所以超时时间设置为10000。socket-timeout="10000"//10s注意:当MongoDB与Spring集成时,如果要配置多个MongDB源,只会启用最后一个配置。参数配置信息应存储在属性文件中。通过JavaAPI获取配置参数DBCollectionlogCollection=mongoTemplate.getCollection(collName);MongoOptionsmongoOptions=logCollection.getDB().getMongo().getMongoOptions();System.out.println(mongoOptions.getSocketTimeout());***一点:ConnectionTimeOut和SocketTimeOut的区别:一个完整??的请求包括三个阶段:EstablishmentConnection数据传输断开如果与服务器(这里指的是数据库)建立连接的时间超过了ConnectionTimeOut,就会抛出ConnectionTimeOutException,即服务器连接超时,在指定时间内没有建立连接。如果与服务器的连接成功,则数据传输开始。如果服务端处理数据的时间过长,超过了SocketTimeOut,就会抛出SocketTimeOutException,即服务端响应超时,服务端没有在规定的时间内返回数??据给客户端。