2013-08-02 3 views
0

나는 단순한 mongo 응용 프로그램을 비동기 적으로 사용합니다 (Akka 사용). 액터로 메시지를 보내면 액터가 데이터베이스에 3 개의 레코드를 씁니다. 필자는 WriteConcern.SAFE를 사용하고 있습니다. 쓰기가 발생했는지 확인하기 (WriteConcern.FSYNC_SAFE도 시도했기 때문입니다).MongoDB WriteConcern Java 드라이버

잠시 멈추고 쓰기가 발생하면 읽기가 수행되고 아무 것도 얻지 못합니다.

그래서 내 쓰기 코드는 다음과 같을 수 있습니다 : 다음
collection.save(myObj, WriteConcern.SAFE) 
println("--1--") 
collection.save(myObj, WriteConcern.SAFE) 
println("--2--") 
collection.save(myObj, WriteConcern.SAFE) 
println("--3--") 

내 테스트 코드에서 (배우 외부 실행 - 다른 스레드에서) 내가 레코드의 #을 인쇄 내가 찾을 :

println(collection.findAll(...)) 

내 출력은 다음과 같습니다.

--1-- 
--2-- 
--3-- 
(pauses) 
0 

실제로 데이터베이스를 보면 기록이 없습니다. 가끔은 실제로 거기에 데이터를 볼 수 및 테스트 작동합니다. 비동기 코드는 까다로울 수 있으며 쓰기가 발생하기 전에 테스트 코드가 히트 될 가능성이 있으므로 타임 스탬프를 인쇄하여 표시된 순서대로 실행되도록 노력했습니다. 데이터가 있어야합니다. 타임 스탬프/w 아래의 샘플 출력 :

Saved: brand_1/dev 1375486024040 
Saved: brand_1/dev2 1375486024156 
Saved: brand_1/dev3 1375486024261 
         1375486026593 0 found 

그래서 3은 읽기가 시도 된 전체 이초 전에 분명히 무슨 일이 있었 세이브 (및 작성해야).

나는이 행동을 취할 수있는보다 자유로운 WriteConcerns에 대해 이해하지만 가장 안전한 두 사람은 진행하기 전에 실제로 기록이 남았음을 확신 할 것이라고 생각했습니다.

+0

앱의 Timestamp 출력은 연산이 순서대로 실행되었음을 증명하지만 카운트 쿼리가 실행될 때 MongoDB가 삽입을 완료했음을 증명하지는 않습니다. 또한 일시 중지는 비동기 호출을 처리하는 신뢰할만한 방법이 아닙니다. 콜백과 제어 흐름의 형식이 정말로 필요합니다. 그러나 2ms 대기는 3ms 이하의 시간 안에 일반적인 크기의 문서에 삽입해야하므로 3 회의 삽입을 수행하는 데 충분합니다. 어떤 Java 드라이버를 사용하고 있습니까? 커뮤니티 비동기 드라이버 또는 MongoDB 기본 드라이버를 사용하고 있습니까? –

+0

casbah를 통해 Java 드라이버 2.11.2를 사용하고 있습니다. 읽기가 테스트 스위트 (스칼라 테 스트)의 일부인 동안 비동기 논리 경로 내부에서 쓰기가 수행되기 때문에 일시 중지가 필요합니다. 프로덕션 코드는 멈춤에 의존하지 않습니다 ... 테스트는 모든 일이 합리적으로 이루어질 수 있도록 충분한 시간을 기다려야합니다. 필자는 SAFE 또는 FSYNC_SAFE WriteConcern이 ​​타임 스탬프가 인쇄 될 때 쓰기가 수행되어야한다는 이론에서 제어 의미를 반환하기 전에 쓰기가 수행되도록해야한다고 생각했습니다. 이 결과는 이러한 WriteConcerns에 대한 나의 이해를 의심하게 만듭니다. – Greg

+0

쓰지 않겠습니까? 쓰기 안전은 쓰기, 클라이언트에 대한 오류 정보 반환을 보장합니다.이 오류는 네트워크, 중복 키와 같은 제약 조건 위반 및 기타 오류 (http://docs.mongodb.org/manual/core/write-concern/)와 관련 될 수 있습니다. 이것은 "화재 및 잊어 버린"미확인 기록에 반대됩니다. Fsync는 쓰기가 데이터 파일로 플러시 된 후에 만 ​​MongoDB가 오류 정보로 응답 함을 의미합니다. 일반적으로 MongoDB는 가상 메모리 (mem 맵 파일)에 씁니다. 일반적인 코드 경로에서는 변경 사항을 데이터 파일 및/또는 저널에 비동기 적으로 플러시합니다. –

답변

0

미묘하지만 단순한 문제. 내 연결을 만들 때 데프 (def)를 사용하고 있었는데, 그 다음 발을 마치 두 번 호출하기 시작했습니다. 그래서 실제로 두 명의 작가가 있었기 때문에 내 결과의 차이점을 설명했습니다. 발에 리팩토링되어 모든 것이 예측 가능했습니다. 식별하기 쉽고, 이해하기 쉽고/고치기 쉽습니다.