成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MongoDB 查詢超時異常的原因及解決辦法

運維 數據庫運維 其他數據庫 MongoDB
在對超過百萬條記錄的集合進行聚合操作時,偶爾會發生Read timed out 異常,本文分析了ConnectionTimeOut和SocketTimeOut的區別,并提出該問題的解決辦法。

在對超過百萬條記錄的集合進行聚合操作。

  1. DBObject match=(DBObject)JSON.parse("{$match:{logType:{'$in':[5,9]}}}"); 
  2. DBObject group=(DBObject)JSON.parse("{$group:{'_id':'$domainUrl','count':{'$sum':1}}}"); 
  3. AggregationOutput output = logCollection.aggregate(match,group); 

偶爾會發生Read timed out 異常。

  1. com.mongodb.MongoException$Network: Read operation to server /192.168.10.202:27017 failed on database adLogTable 
  2. at com.mongodb.DBTCPConnector.innerCall(DBTCPConnector.java:253
  3. at com.mongodb.DB.command(DB.java:261
  4. at com.mongodb.DB.command(DB.java:243) ... 
  5. Caused by: java.net.SocketTimeoutException: Read timed out 
  6. at java.net.SocketInputStream.socketRead0(Native Method) 
  7. at java.net.SocketInputStream.read(SocketInputStream.java:152

通過多次測試,發現執行一次聚合平均時間為5s,超過5s時就會報錯!

然后查看MongoDB的配置信息:

  1. socket-timeout="5000" //5s 

socket-timeout的默認配置為0,也就是沒有限制。

沒有超時限制,系統出了問題也不容易發現,應該根據實際情況,給出合理的超時時間。

通過多次測試發現最長執行時間為6秒,就把超時時間設置成了10000。

  1. socket-timeout="10000" //10s 

注意:MongoDB在與Spring整合時,如果要配置多個MongDB源,只會啟用***一個<mongo:options>配置。

應該把參數配置信息存儲在properties文件中。

  1. <mongo:mongo host="${mongodb.ip}" id="mongo202" port="${mongodb.port}"
  2. <mongo:options connections-per-host="200" 
  3. threads-allowed-to-block-for-connection-multiplier="100" 
  4. connect-timeout="1000" 
  5. max-wait-time="1000" 
  6. auto-connect-retry="true" 
  7. socket-keep-alive="true" 
  8. socket-timeout="10000" 
  9. slave-ok="true" 
  10. write-number="1" 
  11. write-timeout="0" 
  12. write-fsync="true" /> 
  13. </mongo:mongo> 

通過Java API獲取配置參數

  1. DBCollection logCollection = mongoTemplate.getCollection(collName); 
  2. MongoOptions mongoOptions = logCollection.getDB().getMongo().getMongoOptions(); 
  3. System.out.println(mongoOptions.getSocketTimeout()); 

***一點: ConnectionTimeOut和SocketTimeOut的區別:

一次完整的請求包括三個階段:

  • 建立連接
  • 數據傳輸
  • 斷開連接

如果與服務器(這里指數據庫)請求建立連接的時間超過ConnectionTimeOut,就會拋 ConnectionTimeOutException,即服務器連接超時,沒有在規定的時間內建立連接。

如果與服務器連接成功,就開始數據傳輸了。

如果服務器處理數據用時過長,超過了SocketTimeOut,就會拋出SocketTimeOutExceptin,即服務器響應超時,服務器沒有在規定的時間內返回給客戶端數據。

責任編輯:Ophira 來源: oschina博客
相關推薦

2017-06-21 08:30:20

MySQL原因解決辦法

2023-06-20 11:46:58

2015-10-15 09:38:21

程序員發福

2009-11-30 10:09:31

PHP中文亂碼

2009-12-07 18:38:16

WCF異常

2019-08-29 14:29:42

JVM內存 Java

2010-09-01 11:32:50

DB2暫掛

2011-10-17 14:41:26

激光打印機解決辦法

2011-05-07 10:05:17

打印機打印空白頁解決方法

2009-12-22 14:16:01

WCF連接服務超時

2009-07-31 09:14:01

WinCE啟動失敗

2010-05-04 13:52:00

Oracle用戶被鎖

2012-11-12 11:33:06

路由器組網H3C

2012-04-16 10:09:52

2009-01-14 09:16:24

SQL Server查SQL Server查SQL Server

2024-01-04 09:04:02

2023-08-28 10:54:09

容器Docker

2011-07-12 21:52:06

激光打印機技巧

2012-05-30 16:19:11

2010-01-27 12:06:00

UPS常見故障
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品精品视频 | 久久99精品久久久久久国产越南 | 国产69久久精品成人看动漫 | 久久精品这里 | 麻豆久久久久久 | 日韩一区二区在线视频 | 成人永久免费视频 | www亚洲一区 | 中文字幕一区二区三区在线观看 | 日本在线视频一区二区 | 一区二区三区国产 | 国产第一区二区 | 在线国产一区二区 | 久久精品久久综合 | 一级黄色毛片免费 | 欧美一区二区三区在线观看 | 久久看精品 | 午夜在线影院 | 玖玖在线精品 | 一本一道久久a久久精品蜜桃 | 在线亚洲一区二区 | 精品乱码一区二区三四区视频 | 操到爽 | 久久久精品视频免费看 | 欧美高清视频一区 | 中文字幕视频免费 | 色屁屁在线观看 | 亚洲最大的黄色网址 | 精品自拍视频在线观看 | 日日骑| 国产在线a| 欧美黄色片在线观看 | av电影手机版 | 91在线看网站 | 午夜寂寞影院在线观看 | 日本一区高清 | 国产福利视频在线观看 | 亚洲国产在| 久久精品久久综合 | 自拍偷拍第1页 | 特a毛片|