2011-03-29 2 views
4

MongoDb를 사용하고 있는데 DB에서 레코드를 읽는 중 문제가 있습니다. 나는 커서에서 그들을 얻을 수 있어요하지만 난) 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

모든 레코드를 검색 할 수 있습니까? 이 문제의 원인이 될 수있는 방화벽 규칙이 있습니까? 타임 아웃을 시작하기까지 얼마나 걸렸습니까? –

+0

이 오류를 생성하는 사용중인 코드를 붙여 넣을 수 있습니까? 표준 튜토리얼과 비교하면 어떻습니까? 이 오류가 발생하기 전에 문서를 가져오고 있습니까? 아니면 첫 번째 문서를 다시 가져 오기 전에 * 발생합니까? –

+0

당신과 당신의 서버가 비슷한 방화벽이 없도록 할 수 있습니까? 이는 지나치게 공격적인 네트워크 구성원에 의한 시간 초과로 인해 네트워크 포트가 닫힌 경우와 같습니다. –

답변

4

당신이 묘사 한 바를 토대로, 콜렉션에 과도한 읽기로드와 쓰기로드가있는 경우 PHP에서이 문제가 발생했다고 생각합니다. 일부 읽기는 작동하지만 결국에는 시간이 초과되기 시작합니다. 내 커서 타임 아웃은 30 초로 설정되어 있습니다. Mongo를 백엔드 데이터 마이닝/프로세싱에 사용하기 때문에 문제가되지 않습니다. 우리는 서버를 샤딩하여 문제를 다소 완화 할 수 있었지만 문제는 여전히 상당히 정기적으로 발생합니다. 나는 이것이 Mongo의 대부분이 싱글 쓰레드이기 때문에 결국 무거운로드가 긴 프로세싱 큐로 바뀌어 결국 타임 아웃이된다고 생각한다.

또한 인덱스 데이터 또는 실제 데이터로 RAM이 채워지지 않았는지 확인합니다. Mongo가 데이터를 가져 오기 위해 하드 드라이브로 이동해야하며 그 값은 읽는 것보다 over 80x slower입니다. 기억으로부터. 해당 데이터베이스에 대해 db.getStats()을 실행하여 인덱스/데이터 영역이 무엇인지 확인할 수 있습니다.