2011-03-29 71 views
4

我正在使用MongoDb,並且在從數據庫讀取記錄時遇到問題。 我能夠讓他們在光標,但是當我試圖讓使用 cursor.hasNext(光標記錄),它給了我以下異常:Mongo + Java + SocketTimeOut

com.mongodb.MongoInternalException: couldn't get next element 
     at com.mongodb.DBCursor.hasNext(DBCursor.java:459) 
Caused by: java.net.SocketTimeoutException: Read timed out 
     at java.net.SocketInputStream.socketRead0(Native Method) 
     at java.net.SocketInputStream.read(SocketInputStream.java:146) 
     at java.io.BufferedInputStream.fill(BufferedInputStream.java:235) 
     at java.io.BufferedInputStream.read1(BufferedInputStream.java:275) 
     at java.io.BufferedInputStream.read(BufferedInputStream.java:334) 
     at org.bson.io.Bits.readFully(Bits.java:35) 
     at org.bson.io.Bits.readFully(Bits.java:28) 
     at com.mongodb.Response.<init>(Response.java:35) 
     at com.mongodb.DBPort.go(DBPort.java:101) 
     at com.mongodb.DBPort.go(DBPort.java:66) 
     at com.mongodb.DBPort.call(DBPort.java:56) 
     at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:211) 
     at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:220) 
     at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:220) 
     at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:266) 
     at com.mongodb.DBCursor._check(DBCursor.java:309) 
     at com.mongodb.DBCursor._hasNext(DBCursor.java:431) 
     at com.mongodb.DBCursor.hasNext(DBCursor.java:456) 

也許我面臨這個問題,因爲我的數據是不斷增加的,所以我得到更多的遊標記錄。我正在訪問的數據庫也在遠程機器上。

請在這方面需要幫助。

謝謝!

+0

你能找回任何記錄嗎?你有防火牆規則可能導致這個問題嗎?你在超時之前計時了多久? – 2011-03-29 12:06:59

+0

你可以粘貼你使用的代碼來產生這個錯誤嗎?它與標準教程相比如何?在這個錯誤發生之前,你是否收到了一些文件,或者在你收到第一個文件之前發生了這些文件? – 2011-03-30 21:29:52

+0

你能確保你和你的服務器之間沒有防火牆或類似的東西嗎?這看起來像是網絡端口由於網絡過度成員超時而關閉的情況。 – 2011-03-30 23:52:26

回答

4

根據你所描述的,我認爲我在PHP遇到這種嚴重的讀取負載和寫入負載時遇到過這個問題。有些閱讀可能有效,但最終他們會開始超時。我的光標超時設置爲30秒,這不是問題,因爲我們使用Mongo進行後端數據挖掘/處理。我們已經能夠通過分解我們的服務器來緩解這個問題,但問題仍然會經常發生。我認爲這是由於大部分Mongo是單線程的,因此負載變成了一個長處理隊列,最終變成超時。

我也會檢查並確保你的RAM沒有被索引數據或實際數據填滿 - 如果是這樣的話,Mongo必須到硬盤驅動器才能得到這些數據,那是over 80x slower比閱讀從記憶裏。您可以通過針對相關數據庫運行db.getStats()來查看索引/數據佔用情況。