2011-11-17 2 views
1

내 Sqlite 데이터베이스가 내 코드에서 다양한 스레드로 인해 액세스되어 많은 데이터베이스 잠금 문제가 발생합니다.sqlite IOS에서 잠금 문제

잠금 문제를 해결하기 위해 주 스레드에서만 DB를 쿼리합니다. 이 단점은 실행되는 쿼리가 많은 경우 내 메인 스레드가 사용 중입니다.

모든 DB 호출이 (보조 스레드에서) 한 곳에서 실행되어 동기화 될 수 있고 호출자가 모든 스레드에서 호출 할 수있는 메커니즘을 작성하고자합니다.

어떤 모듈이 쿼리를 실행하기를 원한다면 메인 DB Sync 클래스에서 DB가 사용 중인지 또는 작업을 수행 할 수 있는지 여부를 확인합니다.

참고 참고 : 현재 구현에서는 쿼리를 실행할 때마다 DB를 열고 닫습니다. 성능에 어떤 영향을 미칩니 까?

오른쪽 방향의 힌트를 보내 주시면 감사하겠습니다.

답변

2

데이터베이스를 다시 여는 것은 물론 열어 두는 것보다 시간이 오래 걸릴 것입니다. 그러나 그것은 눈에 띄는 시간이 아닐 수도 있습니다.

Grand Central Dispatch queue을 만들고 모든 데이터베이스 액세스에 사용하는 것이 좋습니다. 당신이 그것을 사용하는 방법은 다음과

// The queue needs to be a global variable, or globally accessible in some way. 
dispatch_queue_t dbQueue; 
// Make your sqlite3 connection global too. 
sqlite3 *dbConnection; 

// In your application delegate: 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // usual initialization ... 
    ... 
    int rc = sqlite3_open(dbFilename, &dbConnection); 
    if (rc != SQLITE_OK) 
     handleDbError(rc, dbConnection); 
    dbQueue = dispatch_queue_create("dbQueue", DISPATCH_QUEUE_SERIAL); 
    ... 
} 

입니다 : 여기 당신이 그것을 만드는 방법

dispatch_queue_async(dbQueue, ^{ 
    // This block runs off the main thread, and does not run simultaneously 
    // with any other blocks submitted to `dbQueue`. 
    NSString *result = executeDatabaseQuery(); 

    dispatch_queue_async(dispatch_get_main_queue(), ^{ 
     // This block runs on the main thread. 
     [(MyAppDelegate *)[UIApplication delegate] presentResult:result]; 
    }); 
}); 
+0

내가 직접 반환 값을 얻을 수있는 것보다 반환 값을 필요로 일부 기능이 있거나 좀 기능을 구현해야하는 경우 결과를 얻으려면 presentResult라는 것을 언급해야합니다. 빠른 답장을 보내 주셔서 감사합니다. – Ekra

+0

presentResult와 같은 함수를 구현해야합니다. –

+0

안녕하세요, 저는 당신의 대답을 좋아했지만 저는 묻고 싶습니다. 데이터베이스를 닫아야 할 때? – Streetboy