2012-02-19 5 views
1

DB에 여러 스레드가있을 수있을 때 SQLite로 작업 할 수있는 가능한 방법을 이해하려고합니다. stackoverflow 및 다른 사이트의 다양한 응답을 기반으로 동일한 sqlitehelper 인스턴스가 여러 스레드에서 사용될 때 잠김 문제가있는 것으로 보입니다. 일반적인 자바 응용 프로그램에서 인스턴스의 유형이 sqlite 헬퍼의 단일 객체가 응용 프로그램의 다른 스레드에서 사용된다는 것을 기대합니다. 이러한 경우 잠금은 동기화 된 블록을 올바르게 사용하는 문제입니다. [여기서 sqliethelper 인스턴스를 보는 방법이 마음에 들지 않아서 여기에서 정정하십시오]안드로이드 SQLite : 여러 스레드에서 잠금 + 액세스

동일한 데이터베이스를 공유하는 것이 염려됩니다. sqlite 도우미를 다른 스레드에서 인스턴스화 할 때 [각 스레드마다 고유 한 객체 인스턴스가 있습니다] 동일한 데이타베이스 [동일한 DB 인스턴스를 가지는 것보다 더 많은 인라인입니다]에서 작업합니다. 그런 경우에는 데이터베이스 잠금 오류가 자주 발생합니다. 이것은 스레드가 다른 데이터베이스 테이블에서 작업 중일 때에도 발생합니다.

내 응용 프로그램 데이터베이스는 응용 프로그램을 통해 또는 서버 [정기 동기화]를 통해 데이터를 가져 오는 사용자 상호 작용에 의해 업데이트 될 수 있습니다. 그리고 동기화 프로세스와 사용자 활동이 겹치는 때가되면 잠금 문제가 발생합니다. 이 데이터 처리 패턴은 서버와 동기화되는 응용 프로그램에서 일반적으로 나타나는 것처럼 동시성이 처리되어야하므로 잠금 문제를 어떻게 알고 싶습니다.

나는 이것이 항상 발생하도록 바인딩되어 있기 때문에 이것을 이해하고 싶습니다. 데이터베이스를 통해 하나의 핸들러 만 만들고 잠금을 피하기 위해 큐를 구현해야 할 것입니다. 그러나 완전한 응용 프로그램은 데이터베이스가 즉시 업데이트되지 않을 수 있으며 데이터베이스에서 데이터가 실제로 업데이트되는 시점을 알기 위해 리스너를 구현해야한다는 것을 알고 있어야합니다.

감사 프라 딥

답변

0

지금까지 내가 SQLite는이 single process usage위한 것입니다 알고. 한 번에 한 스레드에서 항상 데이터베이스에 액세스해야하는 경우에도 상관 없습니다. 여러 클라이언트에서 선택을 할 수 있지만 한 번에 하나씩 만 쓸 수 있습니다. 그리고 다른 독자와 작가는 잠시 머물러있게 될 것입니다.

사이드 노트 - 데이터베이스 액세스는 거의 즉시로 간주 될 수 없습니다.

+0

올바른 DB 액세스는 거의 발생하지 않지만 기본 사항은 숨겨져 있습니다. 여기서 일반적인 프로그래밍에서 동기식 호출로 즉각적으로 달라 지겠지만, 하나는 동기식으로 쓰기 작업의 결과를 얻습니다. 결과가 성공하면 해당 데이터에 대해 즉시 읽을 수 있습니다. 하지만 두 가지 스레드가 서로 다른 테이블에서 작동하는 경우에도 자물쇠가 생기면 내 문제가 발생합니다. 그리고 데이터베이스에서 대기 동작을 구현하게 만들면 전형적인 데이터베이스 프로그래밍과는 큰 차이가 없습니다. 심지어 J2SE 프로젝트. – user1050134

+1

실제로 틀립니다. 여러 프로세스가 SQLite 데이터베이스에 액세스 할 수 있습니다. 2 개의 안드로이드 앱을 읽고, 삽입하고, 같은 데이터베이스에서 삭제합니다. – JPM

+0

내가 제공 한 링크를 읽으십시오. 그것은 말합니다 : "여러 프로세스가 동일한 데이터베이스를 동시에 열 수 있습니다. 여러 프로세스가 동시에 SELECT를 수행 할 수는 있지만, 어느 한 프로세스 만 언제든지 데이터베이스를 변경할 수 있습니다." 나는 이것에 대한 데이터베이스 자체의 저자를 신뢰합니다. 이 동시 읽기 및 쓰기를 테스트하는 방법이 궁금합니다. –

관련 문제