출처 - http://aroundck.tistory.com/2781
[android] Concurrent Database Access |
https://github.com/dmytrodanylyk/dmytrodanylyk/blob/gh-pages/articles/Concurrent%20Database%20Access.md
새로운 SQLiteOpenHelper 를 만들면, 이것은 새로운 database connection 을 만드는 것이다.
다른 connection 에서 동시에 한 db 에 write 를 시도하면, 한쪽은 lock 문제로 fail 한다.
여러 Thread 에서 동시에 db 작업을 할 경우에는 반드시 한 connection 을 사용하도록 유도해야 한다.
이 때 주의할 것은 각각의 thread 에서 db.close() 를 호출할 경우
한 connection 의 getDatabase() 는 같은 instance 를 반환하기 때문에 다음 에러를 마딱뜨릴 수 있다.
java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase
그렇다고 close 를 안 시키면 아래의 에러를 마딱뜨리게 될 것이다.
Leak found Caused by: java.lang.IllegalStateException: SQLiteDatabase created and never closed
다음과 같은 방법으로 close 해야 안전하다.
public class DatabaseManager {
private AtomicInteger mOpenCounter = new AtomicInteger();
private static DatabaseManager instance;
private static SQLiteOpenHelper mDatabaseHelper;
private SQLiteDatabase mDatabase;
public static synchronized void initializeInstance(SQLiteOpenHelper helper) {
if (instance == null) {
instance = new DatabaseManager();
mDatabaseHelper = helper;
}
}
public static synchronized DatabaseManager getInstance() {
if (instance == null) {
throw new IllegalStateException(DatabaseManager.class.getSimpleName() +
" is not initialized, call initializeInstance(..) method first.");
}
return instance;
}
public synchronized SQLiteDatabase openDatabase() {
if(mOpenCounter.incrementAndGet() == 1) {
// Opening new database
mDatabase = mDatabaseHelper.getWritableDatabase();
}
return mDatabase;
}
public synchronized void closeDatabase() {
if(mOpenCounter.decrementAndGet() == 0) {
// Closing database
mDatabase.close();
}
}
}
'개발 > 안드로이드' 카테고리의 다른 글
Android GridLayout Tutorial (0) | 2015.01.05 |
---|---|
android generate parcelable open source library (0) | 2015.01.05 |
젤리빈 4.1에서 추가된 다양한 Notification 띄우기 (12) | 2014.04.22 |
Volley (0) | 2014.04.03 |
안드로이드 이미지로드를 위한 오픈소스 라이브러리 (0) | 2014.04.03 |
댓글