[완료] sqlite3 질문입니다.
글쓴이: mog422 / 작성시간: 금, 2010/02/12 - 3:39오전
WM6에서 sqlite3로 프로그래밍하고있습니다.
속도를 위해서 프로그램 시작시 프로그램에서 쓰이는 모든 쿼리를 sqlite3_prepare16로 prepare하고
데이터를 얻어올때 sqlite3_reset -> sqlite3_bind_~ -> sqlite3_step 순으로 코딩을 했는데
이게 단일 프로세스에서는 정상적으로 동작하다가
멀티 프로세스 환경에서는 한쪽이 "database is locked" 라는 메시지를 뱉으면서 작동을 하지 않습니다.
sqlite3_busy_timeout 함수로 5000ms 정도 줘도 마찬가지더군요..
대체 무엇이 문제일까요..
Forums:
다른 쪽에서
다른 쪽에서 트랜젝션을 걸지 않았다면 대부분의 상황은 저널을 데이터 파일에 싱크하는 중 일겁니다.
환경에 따라 이 시간이 부족할 수도 있습니다.
http://sqlite.org/c3ref/busy_handler.html
sqlite3_busy_handler 를 사용하셔서 콜백 함수에서 5m(밀리)s 씩 최대 X번을 쉬게 해보시면 어떨까요?
샘플코드: http://www.mail-archive.com/sqlite-users@sqlite.org/msg05621.html
http://sqlite.org/pragma.html
를 보시고 sync 계열, journal 계열, vacuum 계열 값들을 튜닝해 보시는 것도 도움이 됩니다.
sqlite3_busy_timeout로
sqlite3_busy_timeout로 5초정도 쉬게 했으니 시간이 부족할꺼라곤 생각이 들지 않습니다.
그리고 database is locked이 발생한뒤로 한 1분 뒤에 다른쪽 프로그램을 다시 실행시켰으나 똑같은 에러 메시지를 뱉고 죽었습니다.
제 생각엔 다른 한 프로그램 쪽에서 db를 계속 잡고있는거 같습니다..
많은 쓰레드가 잡고
많은 쓰레드가 잡고 있나요? sqlite3를 이용한 오픈소스 프로젝트를 예전에 했었는데 비슷한 문제를 겪었었습니다.
5초씩 그렇게 되는 경우는 없었었습니다 -.-; 제 경우엔 이걸 피하려고 sqlite3 *를 한 겹 싸고 읽고 쓸 때 락을 걸어서 해결했었는데 그러니까 성능이 안쓰니만 못하게 떨어져 버렸었습니다.
그래서 결국 sqlite3라는 물건은 이런 용도로는 잘 맞지 않는것 같다고 판단하고 포기해 버렸는데 -_-;;
sqlite3에는 예전에도 최근에도 많이 실망을 했는데 임베디드 용이나 경쟁이 심하지 않은 곳에는 쓸만하지만 고성능이 필요한 부분에서는 별로 좋은 물건이 아니라고 생각합니다.
가볍다 = 항상 빠르다 는 아닌것 같습니다..
http://www.sqlite.org/unlock_
http://www.sqlite.org/unlock_notify.html
이문서가 도움이 되실지 모르겠습니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
자답입니다.
sqlite3_reset -> sqlite3_bind_~ -> sqlite3_step 순에서
sqlite3_bind_~ -> sqlite3_step -> sqlite3_reset 순으로 코드를 변경했더니 잘됩니다.
답변 주신 모든분께 감사드립니다.
댓글 달기