2013-10-07 2 views
0

iOS 응용 프로그램에서 SQLite 3을 사용하고 있습니다. 많은 읽기/쓰기 작업이 필요하며 동시에 많은 작업이 동시에 시도됩니다. 이러한 기능의 대부분은 별도의 스레드에서 실행되지만 동일한 데이터베이스에 액세스합니다.IOS에서 Sqlite3 동시성 문제

여기에 몇 가지 내가 생각 한 방법입니다 : 모든 데이터베이스 액세스 (읽기/쓰기) 내가 database_open=YES로 플래그를 넣어에서

  1. , 그리고 그것은 사실이 발견되면 나는 몇 초 후에 다시 시도하십시오. 데이터베이스 레이어 자체에 함수를 넣을 수 있습니다.

  2. 동일한 스레드에서 모든 데이터베이스 작업을 실행하십시오. 그러나, 나의 유스 케이스는 일부 HTTP 호출이 끝날 때까지 기다려야하고, 수집 된 데이터를 SQLite에 저장해야한다. 이 방법을 사용하려면 이러한 모든 서버 호출을 동기식으로 만들어야합니다. 최고의 아이디어는 아닙니다.

잘못된 방향으로 생각하고 있는지 제안 해주세요.

+2

offtopic : [FMDB] (https://github.com/ccgus/fmdb)를 시도해야합니다. FMDB는 쓰레드 저장이고 SQL 문에 대한 간단한 인터페이스를 가지고있다. – CarlJ

+0

또는 더 정확하게 말하자면, 두 쓰레드가 수행 할 별도의 직렬 큐를 갖춤으로써 다른 쓰레드로부터의 데이터베이스 상호 작용을 조정하기위한 메커니즘으로 FMDB의 'FMDatabaseQueue'를 사용할 수있다. 데이터베이스 상호 작용을 파견하십시오. FMDB를 사용하지 않더라도이 패턴을 사용하여 서로 다른 스레드의 데이터베이스 상호 작용을 조정할 수 있으며 모든 상호 작용을 전달할 직렬 큐가 있습니다. – Rob

+0

고마워. 이것은 내 문제를 해결하는 것 같다. 나는 그들의 FMDatabaseQueue를 읽었는데, 정확히 내가 필요로하는 것을 수행한다. :) –

답변

1

SQLite supports concurrent access from multiple threads. 간단히 SQLITE_CONFIG_MULTITHREAD 모드를 구성하고 각 스레드에서 데이터베이스를 개별적으로 엽니 다.

+0

예제 코드를 제공해 주실 수 있습니까? –