2010-02-25 3 views
1

나는 두 개의 프로세스가 : 정기적으로 독자와 작가 프로세스 SQLite는

내가 아는

  1. 말했다 테이블에서 읽어 두 테이블마다 초 (틱)에 기록을하는 SQLite는과, 어떤 쓰기 전체 데이터베이스를 잠그면 가끔 두 번째 프로세스가 잠긴 데이터베이스로 실패 할 수 있습니다.

    이 두 프로세스가 동일한 데이터베이스를 처리 할 필요가 완전히 없도록 제안 할 수있는 것이 있습니까? 예를 들어, 내가 원자 본적으로 데이터베이스에서 두 번째 읽기 전용 데이터베이스로 데이터를 전송할 수 있습니까?

    감사합니다 :)

+0

읽기 전용 데이터베이스에 쓰기? 선생님, 저는 그것이 모호성이라고 믿습니다. 왜 내가 그렇게 할 수 있겠습니까? – MPelletier

+0

그래, 그게 어리석은 짓 같아요. 나는 두 번째 과정에서 읽기 전용을 의미했습니다. 이것은 스레드가 아니지만 여러 개의 OS 수준 프로세스가 있습니다. 하나는 백그라운드 서비스이고 다른 하나는 UI입니다. – cheez

답변

2

에 SQLITE_THREADSAFE 처리기 매크로 설정하여 컴파일해야합니다 바쁜 데이터베이스, 포기하기 전에 정기적으로 무료 데이터베이스를 확인하기 위해 깨어나십시오.

sqlite3_busy_timeout(sqlite3*, int ms); 

http://www.sqlite.org/c3ref/busy_timeout.html

+0

http://stackoverflow.com/questions/78801/sqlite3busyexception/95255#95255 – ravenspoint

+0

아,이게 옳은 일처럼 보입니다. 그것은 내가 어떤 경우에 구현하지만 sqlite 대신 관리하는 것이 좋을 것입니다. – cheez

+0

음, 설명서를 읽었지만 이해하지 못합니다. 그것은 바쁜 처리기가 지정된 시간 동안 잠자기 후 0을 반환한다고 말할 것입니다. 재 시도 할 것이라고는 보이지 않습니다 ... 적어도 혼란 스러울 것입니다. – cheez

0

내가 SQLite는 thread safety에 대한 FAQ를 읽어 보시기 바랍니다 수 있습니까?

Threads are evil. 그들을 피하십시오.

SQLite는 threadsafe입니다. 우리는 많은 사용자가 이전 단락에서 주어진 조언을 무시하기로 선택했기 때문에이 양보를합니다. 그러나 스레드 안전을 위해, SQLite는은 그것이 발생 때 일정 시간 동안 대기하는 두 번째 과정에서 데이터베이스에 대한 연결을 구성 할 수 있습니다 1.

+0

물론이 경우 스레드가 아닌 여러 프로세스가 있습니다. 하나는 백그라운드 서비스이고 다른 하나는 UI입니다. – cheez

+0

글쎄, 좋아. :) 이미 래퍼가있을 수 있지만 ravenspoint의 솔루션을 사용하면 더 깨끗하게 될 수 있습니다. – MPelletier