2012-05-26 4 views
3

나는 현재 SQLiteDatabase 및 관련 클래스를 사용하여 동시성을 처리하는 방법을 더 잘 이해할 목적으로 grokking하고 있습니다 (현재 솔루션이 작동하지만 현재 중복 작업을 수행하고있는 것처럼 보입니다. , 왜냐하면 동시성이 나를 위해 처리되지 않는다고 가정하기 때문이다). 당신은 당신이 데이터베이스에 작성해야 할 때마다이 메소드를 호출 할 수 있도록 안드로이드, SQLite 연결 및 트랜잭션

오른쪽, SQLiteOpenHelper에 대한 안드로이드 문서에 대한하여 getWriteableDatabase 방법 일단 성공적으로 오픈

에 대해 다음과 같은 상태 는, 데이터베이스, 캐시

. ( 호출 close()를 더 이상 데이터베이스를 필요로하지 않을 때해야합니다.)

이 캐시되고 있는지 나에게 조금 불분명하다 (그래서 현재 나를 위해 캐싱을하는 래퍼가). 그래서, 여기서 무슨 일이 일어나고있는거야? 두 개의 SQLiteDatabase 인스턴스가 캐시/정적 인스턴스 주위에 래퍼됩니까?

또한 실제 잠금이 어떻게 처리됩니까? 동일한 SQLiteOpenHelper 인스턴스에 의해 생성 된 두 개의 개별 SQLiteDatabase 인스턴스가 있으면 트랜잭션 안전이 보장됩니까? 하나의 트랜잭션에서 독점 모드로 트랜잭션을 시작한 다음, 다른 SQLiteDatabase 인스턴스의 다른 스레드에서 다른 트랜잭션을 시작하는 경우, 첫 번째 트랜잭션이 완료 될 때까지 두 번째 트랜잭션이 시작되지 않을 것으로 예상됩니다. 어떻게 작동합니까?

답변

2

캐시되고있는 부분이 약간 불투명합니다. (현재 캐시 용 래퍼가 있습니다.)

SQLiteDatabase 개체가 캐시됩니다.

이 메서드로 두 개의 SQLiteDatabase 인스턴스를 만들고 하나를 닫으면 다른 인스턴스는 여전히 열려 있습니다.

SQLiteOpenHelper이 하나만 있다고 가정하면이 방법으로 두 개의 SQLiteDatabase 인스턴스를 만들 수 없습니다. 두 번째 getWriteableDatabase() 호출은 첫 번째 호출과 마찬가지로 SQLiteDatabase을 반환합니다.

단일 구성 요소 (예 : 하나의 활동 또는 하나의 서비스 만)에서 데이터베이스에 액세스하는 경우 해당 구성 요소가 보유하는 SQLiteOpenHelper (그리고 확장하여 하나만 SQLiteDatabase)을 사용하십시오. 여러 구성 요소에서 데이터베이스에 액세스하는 경우 직접 또는 데이터베이스를 ContentProvider에 랩핑하여 싱글 톤 SQLiteOpenHelper 인스턴스로 이동해야합니다.

3

"캐싱".. 음, 네가 그렇게 부를 수있을 것 같아. SQLiteOpenHelper은 일반적으로 내부적으로 (데이터베이스를 마지막으로 생성 한 이후로) SQLiteDatabase을 저장하므로 #getWritableDatabase()을 두 번 호출하면 두 번째 동일한 객체가 나타납니다 (첫 번째 인스턴스를 닫지 않으면 다시 생성됩니다). 실제로 #getReadableDatabase()을 호출하면 데이터베이스 r/w를 열려고 시도하고 실패 할 경우 읽기 전용 인스턴스 만 반환합니다.

참고 데이터베이스 &을 호출하는 것은 스레드로부터 안전하지 않습니다. 즉, SQLiteOpenHelper은 많은 스레드에서 문제가 발생하면 닫힌 데이터베이스를 반환 할 수 있습니다.

한마디로 SQLiteDatabase의 단일 인스턴스를 갖지만, SQLiteDatabase#setLockingEnabled(true)을 호출하여 잠금을 설정하여 스레드로부터 안전하게 할 수 있습니다.

+0

감사합니다. +1 – JustDanyul