2011-12-14 3 views
1

내 안드로이드 응용 프로그램에 SOA 아키텍처를 사용하고 있습니다. 저는 백그라운드에서 (1 분마다) MYSQL 데이터베이스에서 데이터를 가져 와서 SQLite 데이터베이스와 동기화합니다 (2 개 데이터베이스에 변경 사항이있는 경우).SQlite : 데이터베이스 잠김 오류

이제 서비스가 백그라운드에서 실행될 때 SQLite가 열립니다. 동시에 (사용) 응용 프로그램을 처리하는 경우 Sqlite를 열어 데이터를 가져 오려고 시도합니다. 이 경우 다음과 같은 오류가 발생합니다. 데이터베이스가 android.database.SQLiteOpenHelper.getReadableDatabase에 잠겨 있습니다.

아무도 제발 이런 종류의 상황에서 할 수있는 제안을 할 수 있습니까?

+0

귀하의 제안에 따르면, 나는 이런 식으로 DatabaseHelper (래퍼 클래스)의 단일 인스턴스를 만들었습니다 : private static DatabaseHelper instance; public static synchronized DatabaseHelper getHelper (컨텍스트 컨텍스트) { if (instance == null) 인스턴스 = 새 DatabaseHelper (컨텍스트); return instance; 내가 DatabaseHelper의 방법을 사용해야 할 때마다 } 지금 내가 follws로 전화 : \t \t DatabaseHelper dB = DatabaseHelper.getHelper (이); \t BaseObject bObj = db.GetObjectFromDB ("GlobalObject1"); – Neha

+0

이제 GetObjectFromDB는 DatabaseHelper의 메서드입니다.이 메서드는 Sqlite DB에서 데이터를 읽습니다. DB에 액세스하려면이 방식으로 처리해야합니다. \t SQLiteDatabase db = this.getReadableDatabase(); 이전에 말한 것처럼 내 응용 프로그램은 많은 스레드를 실행합니다. 내 스레드 중 하나가 DB에 액세스하면 다른 스레드도 동일한 메소드 GetObjectFromDB를 사용하여 DB에 액세스하려고 시도합니다. 내 문제는 getReadableDatabase() 항상 새 DB 연결을 엽니 다. 이 조건을 어떻게 극복 할 수 있습니까? 감사합니다. Neha – Neha

+0

안녕 모두, 내 질문에 대한 답변을 얻었습니다. 나는 래퍼 클래스 인 DataBasehelper의 정적 인스턴스와 SQLiteDatabase의 정적 인스턴스를 만들었습니다. private static DatabaseHelper instance; 개인 정적 SQLiteDatabase sqlitedb = null; 공개 동기화의 SQLiteDatabase getHelper() { 경우 (sqlitedb == NULL) { sqlitedb this.getWritableDatabase =(); } else if (sqlitedb.isOpen() == false) { sqlitedb = this.getWritableDatabase(); } return sqlitedb; } 이제 DB를 다음과 같이 호출합니다. SQLiteDatabase db = this.getHelper(); – Neha

답변

1

앱과 백그라운드 서비스간에 단일 데이터베이스 연결을 공유해야합니다. 이렇게하면 데이터베이스에 대한 모든 액세스가 올바르게 직렬화됩니다.

+0

고마워요 :) – Neha

0

SQlite는 한 번에 하나의 응용 프로그램에만 액세스 권한을 부여하는 파일 기반 데이터베이스입니다. 서비스가 새로운 데이터를 가져 오기 위해 응용 프로그램에 대한 약간의 시간을 할 수 있도록 당신은 당신의 응용 프로그램과 서비스를 동기화 중 하나가

  1. (이 하나 많은 솔루션이있다, 세마포어, 모니터 및 라운드 로빈을 찾아).
  2. 당신은 당신의 서비스 및 응용 프로그램을 대기열에서 데이터베이스에 대한 I/O 요청을 얻을 것이다 번째 서비스를 사용하여, 요청 된 I/O를 수행하고를 제출 한 응용 프로그램이나 서비스에 어떤 결과를 를 반환 의뢰.

2

여기서 ContentProvider을 사용하는 것이 좋습니다.

주로 응용 프로그램간에 공유를 목표로하고 있지만 단일 응용 프로그램 내에서 사용할 수 있습니다.

콘텐츠 제공 업체를 사용하는 경우 db를 닫고 잠글 염려가 없습니다.

SQLite는 3 다중 연결에 대한 지원을하고, 사실이 아니다 Simple Content Provider for db operations

0

를 참조하십시오, 당신은 그들에게 모두 개방을 유지 할 수 있습니다. 업데이트 스레드에서 트랜잭션을 사용하고 최대한 빨리 닫아야합니다.

http://www.sqlite.org/lockingv3.html에서이 약

읽기, 당신은 파이썬을 사용하고 당신은 예를 들어, 수도 db에 연결할 때 timeout 매개 변수를 설정하면 리더 스레드가 포기하기 전에 최대 시간 (초) 동안 대기하게됩니다. 따라서 업데이터를 최대한 작게 만들어서 독자가 시간 초과되지 않도록하는 것이 중요합니다. 만약 더 알고 싶다면

http://docs.python.org/library/sqlite3.html

또한, 나는 깊이 다음과 같은 책을 권 해드립니다.SQLite에 대한 확실한 안내서 : http://www.apress.com/9781590596739

관련 문제