태그 보관물: database is locked

여러 process에서 CookieSyncManager를 사용할 경우 DB error

Application에서 CookieSyncManager, CookieManager를 생성하게끔 되어 있었는데 Service, IntentService 등을 사용하게 되면서 아래와 같은 에러가 자주 발생하였습니다.

01-13 16:44:46.674: E/Database(4298): CREATE TABLE android_metadata failed
01-13 16:44:46.690: E/Database(4298): Failed to setLocale() when constructing, closing the database
01-13 16:44:46.690: E/Database(4298): android.database.sqlite.SQLiteException: database is locked
01-13 16:44:46.690: E/Database(4298): at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)
01-13 16:44:46.690: E/Database(4298): at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:2113)
01-13 16:44:46.690: E/Database(4298): at android.database.sqlite.SQLiteDatabase.(SQLiteDatabase.java:1966)
01-13 16:44:46.690: E/Database(4298): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:887)
01-13 16:44:46.690: E/Database(4298): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:965)
01-13 16:44:46.690: E/Database(4298): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:958)
01-13 16:44:46.690: E/Database(4298): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:576)
01-13 16:44:46.690: E/Database(4298): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
01-13 16:44:46.690: E/Database(4298): at android.webkit.WebViewDatabase.getInstance(WebViewDatabase.java:214)
01-13 16:44:46.690: E/Database(4298): at android.webkit.WebSyncManager.(WebSyncManager.java:65)
01-13 16:44:46.690: E/Database(4298): at android.webkit.CookieSyncManager.(CookieSyncManager.java:69)
01-13 16:44:46.690: E/Database(4298): at android.webkit.CookieSyncManager.createInstance(CookieSyncManager.java:96)

이런 에러가 발생한 이유는 여러개의 process에서 CookieSyncManager.createInstance()를 하면서 내부의 DB를 create하는데 이 DB는 multi-process를 지원하지 않기 때문으로 보입니다.

여러 프로세스에서 CookieSyncManager를 사용할 수 있는 방법은 찾지못하였고 메인 앱에서만 CookieSyncManager를 사용하는 식으로 해결하였습니다.

테스트해본 결과 한 프로세스에서 createInstance()를 한 후에 다른 프로세스에서는 getInstance()로 가져올 수는 없었습니다.
그리고 참고로 CookieSyncManager를 생성하지 못하면 CookieManager도 사용할 수 없습니다.