2012-06-05 2 views

답변

2

오류를 확인하지 않으면 업데이트가 fireAndForget입니다. 발생할 수있는 모든 오류를 정말로 놓치게됩니다. MongoDB WriteConcerns에서 MongoDB의 사용 가능한 쓰기 모드를 확인하십시오. (필자는 항상 공식적인 드라이버가 아닌 관련 문서를 찾지 못해 죄송합니다. 정말로 북마크해야합니다).
NORMAL을 사용하면 최소한 연결 오류는 발생하지 않으며 NONE 예외는 전혀 발생하지 않습니다. 예외에 대한 정보를 얻고 싶다면 다른 모드 중 하나를 사용해야합니다.이 모드는 지속성 보장에서만 다른 점이 있습니다.
비동기 실행시 오류를 감지 할 수 없습니다. 이는 의도하지 않은 것입니다. 쓰기 작업을 보낸 연결은 이미 닫혀 있거나 다시 사용할 수 있으므로 해당 연결을 통해 보낼 수는 없습니다. 실제 코드는 더 이상 실패 할 경우 수행 할 작업을 알고 있습니다. mongoDB는 비동기 호출에 대한 원격 프로 시저 호출을 제공하지 않기 때문에 업데이트를 알리면 지정된 단계까지 쓰기가 완료 될 때까지 기다려야합니다.
가장 빠르지 만 가장 신뢰할 수없는 것은 SAFE입니다. SAFE는 쓰기가 메모리에만 발생한 곳입니다. JOURNAL은 최소한 디스크에 작성된 보안을 제공합니다. FSYNC를 사용하면 디스크의 db에 변경 사항을 저장하게됩니다. REPLICA는 최소 2 개의 복제본이 그것을 작성했으며, 복제본의 절반 이상이이를 작성했습니다 (기본값 인 3 개의 복제본이 다르지 않음).

비동기와 같은 것을 볼 수있는 유일한 기회는 모든 쓰기 작업을 동기식으로 수행하는 별도의 스레드를 갖는 것입니다. 이 스레드는 실제 업데이트와이 실패를 처리하는 데 필요한 작업을 수행하지 못한 경우에 호출되는 클래스를 처리 할 수 ​​있습니다. 그러나 이것이 좋은 애플리케이션 설계라고 생각하지 않습니다.

+1

"getLastError"사용에 대한 추가 정보는 Phil이 암시 한대로 MongoDB가 응답을 기다리는 지 확인합니다 - http://www.mongodb.org/display/DOCS/getLastError+Command. 그리고 다른 - http://docs.mongodb.org/manual/faq/replica-sets/#are-write-operations-durable-without-getlasterror. 마지막으로 공식 드라이버 문서 - http://docs.mongodb.org/manual/applications/drivers/입니다. –

1

예, 오류에 따라 반환 된 오류 코드를 확인하지 않으면 자동으로 실패 할 수 있습니다. 오류 검사를 기다리는 것이 필요합니다. 귀하의 유일한 대안은 귀하의 앱이 간혹 사용자에게 "귀하가 잠시 데이터를 저장 한 것처럼 행동했을 때를 기억합니까?"라고 말할 수 있습니다.

+0

나는 마지막 문장에 대해 확신하지 못합니다. Mongo를 빠르게 만드는 이유 중 하나는 쓰기가 버퍼링되고 비동기 적으로 작성된다는 것입니다. 오류 코드를 확인하면 디스크에 내용이 기록 될 때까지 반드시 차단해야한다는 것을 이해합니다. 이 이해가 잘못 되었습니까? – nilskp

+1

네 말이 맞아. 네트워크 오류를 제외하고는 mongod에서 쓰기가 발생하여 예외가 없는지 확인해야합니다. 이로 인해 비동기가 아닌 동기를 수행하게되므로 응용 프로그램의 속도는 저하되지만 서버는 그렇지 않습니다. 그렇지 않으면 대부분의 검사가 필요할 것이므로 그 정도는 아닙니다. 자세한 내용은 내 게시물을 참조하십시오 – philnate

+0

당신의 답변을 수정할 수 있습니다. –

관련 문제