2011-05-12 8 views
2

데이터베이스 활동이 많은 응용 프로그램이 있습니다. 때로는 SQLite '데이터베이스 잠김'오류가 SQLiteExceptions로 이어지는 데 사용되었습니다. Whie 사용하려고 시도했습니다 :안드로이드에서 sqlite '데이터베이스 잠김'오류 처리

저장 또는 삽입을 사용하기 전에 성공하지 못했습니다. 그래서 저는 예를 들어 수업에서 다음과 같이 설정했습니다.

public AtomicBoolean getWritingToDataBaseFlag() { 
    return writingToDataBaseFlag; 
} 

내가 삽입을 수행하거나이 같은 일을 저장하려는 시간 :

boolean succeeded = false; 
while(!succeeded) { 
    if(application.getWritingToDataBaseFlag().compareAndSet(false, true)) { 
     if((!db.isDbLockedByCurrentThread())&&(!db.isDbLockedByOtherThreads())) { 
      if(!activity.isFinishing()) { 
       set_id(db.insert(SDIGENRE, SDIID, cv)); 
      } 
     } 
     application.getWritingToDataBaseFlag().compareAndSet(true, false); 
     succeeded = true; 
    } else { 
    // Wait 100 millis 
    try { 
     Thread.sleep(100); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

이를 접근과

private AtomicBoolean writingToDataBaseFlag = new AtomicBoolean(false); 

: 응용 프로그램과 같이 확장하여 MyApplication 꽤 오래 동안 잘 작동 한 것 같습니다.

  1. 이 문제를 해결하려면 올바른 방법입니까?
  2. 나는이 오류를 다시보기 시작했습니다. 이 문제를 디버깅하는 방법에 대한 조언이 있습니까?

어떤 도움을 주셔서 감사합니다. 줄리어스.

답변

1

내 응용 프로그램에 연결된 DbHelper (SQLiteOpenHelper) 인스턴스가 하나만 있습니다. 이 모든 호출을 통해 모든 동시성 문제가 발생하지 않습니다.

0

괜찮아요, 정보에 액세스 할 수 있습니다. 스레드에 대한 흥미로운 기사를 찾으십시오. 데이터베이스를 운영하십시오.

안드로이드 워드 프로세서에서 : isDbLockedByOtherThreads()는 API 16 이후에 더 이상 사용되지 않습니다. 항상 false를 반환합니다. 이 방법을 사용하지 마십시오.

그래서 문제는 isDbLockedByCurrentThread()에서 왔습니다.

안드로이드 API

는 방법에 대해 말했다 :

반환 사실, 현재의 thread가 데이터베이스에 활성 연결을 유지하는 경우.

이 메서드의 이름은 데이터베이스에 대한 활성 연결로 인해 스레드가 데이터베이스에서 실제 잠금을 유지하고 있음을 의미합니다. 오늘날에는 특정 작업을 수행하기 위해 데이터베이스 연결을 얻을 수없는 경우 스레드가 차단 될 수 있지만 더 이상 진정한 "데이터베이스 잠금"은 없습니다.

사실, 안드로이드 프레임 워크의 sqlitedatabase에 삽입, 삭제, 수정할 때 모두 단일 스레드에 관한 것입니다. 그것은 당신이 두 개 이상의 쓰레드를 사용할 때 sqlitedatabase를 조작 (삽입, 삭제, 수정)하면 '데이터베이스 잠김'오류를 발생시킵니다.

그러나 동일한의 SQLiteDatabase를 큐에 멀티 스레딩을 열 수 있습니다, 그것은 어떤 문제가 그런데

가되지 않습니다, 당신은 삽입을 처리 할 때 대기하려면; 당신은 사용해야합니다

getWritableDatabase().enableWriteAheadLogging(); 

안드로이드 3에서만 작동합니다.0 이상;

어쩌면이 문서를 읽어야합니다 (중국어를 읽을 수있는 경우, 하하) : http://tech.techweb.com.cn/thread-621414-1-1.html

관련 문제