2011-09-04 10 views
3

SQLite 데이터베이스에 여러 프로세스로 작성하고 싶습니다.여러 프로세스가있는 C++/SQLite - db 액세스

stringstream sstream << "BEGIN;" << query << "COMMIT;"; 

sqlite3_busy_timeout(databasePtr, 60000); // set timeout if sql busy 

if((result = sqlite3_exec(databasePtr, (sstream.str()).c_str(), NULL, NULL, NULL)) != SQLITE_OK){ 
    /** ERROR or SQLITE_BUSY **/ 
}  

sqlite3_busy_timeout(databasePtr, 0); // reset sql_busy handler 

내가 sqlite3_busy_timeout 성공에 이르게 생각 : 여기 내 C++ 코드입니다. 그러나 결과를 확인한 결과 데이터베이스에 모든 데이터가 기록되는 것은 아닙니다. 내 실수는 어디 갔지?

sqlite3_busy_timeout을 60000 (ms)으로 설정하면 sqlite3_exec가 호출되는 빈도를 아는 사람이 있습니까? 또는 SQLite_BUSY를 사용하여 첫 번째 시도가 반환되는 경우 60000 (ms) 후에 하나의 호출 만 있습니까?

다음 코드로 문제를 해결하려고했습니다. 그러나 항상 활성 프로세스가 하나만있는 것처럼 보입니다. 다른 프로세스까지 ..., (SRC/main.c에있는 sqliteDefaultBusyCallback()) sqlite3_busy_timeout 설치 바쁜 핸들러는 다음이 1ms 동안 휴면 및

do{ 
    if((result = sqlite3_exec(databasePtr, (sstream.str()).c_str(), NULL, NULL, NULL)) != SQLITE_OK){ 
     if(result == SQLITE_BUSY){ 
      sleep(60000); // sleep 10 sec 
     }else{ 
      /** ERROR **/ 
     } 
    } 
}while(result == SQLITE_BUSY); 

답변

2

기본값이 2ms에 대한 다음, 다시 시도 ... 5ms의 완료되지 않습니다 수면 시간이 지정된 시간 초과 값을 초과했습니다.

그래서 내부적으로 수행되는 작업을 복제하지만 시간이 오래 걸릴 수 있습니다 (sleep() 인수는 초 단위이므로 코드가 18 시간 동안 잠자기 상태가됩니다). 그건 그렇고 60000ms = 60s는 sqlite3_busy_timeout처럼 타임 아웃에 너무 많은 것처럼 보입니다. 재시도 사이의 백 오프 시간은 말할 것도 없습니다.