2011-11-03 3 views
8

2 개의 다른 스레드에서 SQLite 데이터베이스에 액세스하여 데이터베이스에 2 개의 다른 연결을 사용하고 싶습니다. 두 스레드는 주로 DB에서 읽기를 수행하며 때때로 DB에만 씁니다. DB에 동시에 쓰는 두 스레드에 대한 확률이 높다고 판단되면이 시나리오에서 문제가 없어야한다고 생각합니까?SQLite 연결 및 잠금

답변

6

SQLite는 최근 버전으로, 당신은 스레드간에 단일 연결을 공유 할 수 있습니다, 스레드를하고. 즉, SQLite FAQ는 "Threads Are Evil"이라고 말합니다. (SQLite의 컨텍스트에서는이 것이 아니라고 생각합니다.)

SQLite에는 잠금 메커니즘이 있습니다. 따라서 두 번째 인스턴스가 데이터베이스에서 쓰기 잠금을 얻으려고해도 기존 잠금이 완료 될 때까지 대기하므로 두 스레드가 모두 SQLite를 쓰는 경우에도 대기합니다. 자주 묻는 질문은 다른 프로세스에서 복수 연결 on 네트워크 파일 시스템이 파일 시스템에서 제대로 구현되지 않아 안전하지 않다는 것이지만 사용자의 사용에 경고가 적용되지 않는다고 생각합니다.

+0

고마워요 ... FAQ는 좋은 리소스였습니다 –

+0

하지만 @DrakeAmara 케이스에서 데이터베이스에 대한 동시 요청은 없을 것입니다. 별도의 연결이 있습니다. 데이터베이스 – user1530779

0

SQLite는 명시 적으로 스레드로부터 안전하지 않으므로 이렇게하면 데이터가 손상 될 수 있습니다.

뮤텍스 잠금을 사용하면 두 스레드가 동시에 데이터베이스에 액세스 할 수 없으며 거의 ​​발생하지 않고 복제하기 어려운 방식으로 팬텀 데이터 손상 버그를 추적하는 데 많은 시간을 소비 할 수 있습니다.

http://sqlite.org/faq.html#q5

+4

문서에서 (http://www.sqlite.org/faq.html# q3) : ** SQLite는 threadsafe입니다 ** ** –

9

맞지 않습니다. 여기 내 긴 대답을 참조하십시오

What are the best practices for SQLite on Android?

두 개의 서로 다른 연결을 가진 두 개의 서로 다른 스레드, 동시에 DB에 쓰기를 시도하는 경우에 당신은 손상되지 데이터베이스하지만, 문제가있을 것이다 것 . 하나는 "잃어 버릴"것이다. 그들은 순서대로 달리는 것을 기다리지 않을 것입니다. 'insertOrThrow'대신 'insert'를 호출하면 예외가 발생하지 않습니다. 당신은 DB에 쓰지 않을 것입니다.

다음은 Android에서 Sqlite가 작동하는 방식입니다. 각 SqliteOpenHelper 인스턴스에는 데이터베이스에 대한 연결 수가 1 개 있습니다. 'getRead/WriteableDatabase'를 여러 번 호출하는 것은 중요하지 않습니다. 하나의 도우미, 하나의 연결. 또한 안드로이드 sqlite 연결 코드는 자체 스레드 잠금을 구현하므로 같은 SqliteOpenHelper를 사용하고 확장자가 동일한 경우에도 연결은 잘됩니다.

그러나 두 명 이상의 도우미를 사용하는 경우 나쁜 방법이 될 수 있습니다.

나는 여러 개의 스레드 읽기와 1 개의 쓰기가있을 수 있으며 OK라고 나오지만이 테스트를 수행하지 않은 것으로 판단됩니다.

쓰기 성능을 위해 다중 스레드를 사용하고 있습니까? 그렇다면 단순히 "거래"의 사용을 최적화하는 것이 좋습니다. 여러 개의 독립 쓰기를 수행하는 경우 매우 느립니다. 만약 당신이 일괄 적으로 그것들을 포장한다면, 그것은 매우 빠릅니다 (상대적으로). 나는 각각의 독립적 인 쓰기와 함께 안드로이드가 디스크로 플러시 (매우 느리다) 때문이라고 생각한다. 당신이 무리에서 그들을한다면, 변경 사항은 모두 1로 작성됩니다.1 도우미 인스턴스를 유지으로

는, 여기에 대한 내 최근 블로그 게시물입니다 :

http://touchlabblog.tumblr.com/post/24474750219/single-sqlite-connection

내가 OrmLite 안드로이드 포트의 나의 초기 구현의 일환으로 일부 매우 복잡한 참조 카운팅 로직을 작성했다, 그러나 나는 이것이 모든 시점에서 필요하다고 생각하지 않는다. 링크의 완성도를 들어

http://touchlabblog.tumblr.com/post/24474455802/ormlite-for-android

, SQLite는 잠금 및 다중 연결에 대한 내 블로그 게시물 :

http://touchlabblog.tumblr.com/post/24474398246/android-sqlite-locking

+0

그 링크는 이제 죽었습니다. 현재 링크를 게시 할 수 있습니까? 실제로이 링크를 읽는 데 관심이 있습니다. 감사! – Matthias

+1

정확합니다. 내가 그들을 가지고 있는지 주위를 파고보고해야합니다. 존재하는 경우 http://touchlabblog.tumblr.com 아래에 있습니다. –

+0

발견했습니다. 감사합니다! – Matthias