android multithreading sqlite posix android-5.0-lollipop

Android Lollipop 5.0.1 SQLiteLog POSIX Error 11 SQLite Error: 3850



multithreading android-5.0-lollipop (1)

Writer bloquea la base de datos tanto para leer como para escribir. Eso significa que tiene que esperar a que todos los lectores terminen y liberen los bloqueos para obtener el bloqueo.

Después de que el escritor solicitó un bloqueo, los nuevos bloqueos del lector deben esperar a que el escritor primero obtenga el bloqueo y luego lo libere.

Esta podría ser una solución para usted: modo WAL

Activando y configurando el modo WAL:

Una conexión de base de datos SQLite se establece de forma predeterminada en journal_mode = DELETE. Para convertir al modo WAL, use el siguiente pragma:

PRAGMA journal_mode=WAL;

WAL no bloqueará los lectores mientras escribe, lo que significa que el escritor no necesita esperar a que se liberen los bloqueos de lectura actuales.

La versión mínima de SQLite requerida para WAL es 3.7.0 (2010-07-21) . Lollipop 5.0 usa SQLite 3.8.4.3, por lo que WAL debería estar disponible para usted.

Pero WAL no existe en la versión de Android menos de 3.0, aunque hay algunas excepciones a esto. Echa un vistazo a la versión de SQLite utilizada en Android? . Si no necesita que su aplicación funcione por debajo de Android 3.0, puede usar WAL.

Tengo un problema al actualizar una aplicación para que sea compatible con Android Lollipop. La aplicación implementa un SyncAdapter que escribe en una base de datos a través de un proveedor de contenido. Al mismo tiempo, puede suceder que el usuario navegue por el extremo frontal de la aplicación donde los cargadores leen los mismos datos de la base de datos. Los cargadores también escuchan los cambios de datos.

Ahora, si ejecuto el programa en un dispositivo pre-Lollipop, todo funciona sin ningún error.

En Lollipop en su lugar recibo el siguiente mensaje logcat:

11:20:59.344 22341-22376/com.example.com E/SQLiteLog﹕ (10) POSIX Error : 11 SQLite Error : 3850 11:20:59.364 22341-22376/com.example.com E/SQLiteLog﹕ (10) POSIX Error : 11 SQLite Error : 3850 11:20:59.364 22341-22376/com.example.com E/SQLiteLog﹕ (10) POSIX Error : 11 SQLite Error : 3850 11:20:59.364 22341-22376/com.example.com E/SQLiteLog﹕ (10) POSIX Error : 11 SQLite Error : 3850

Ahora, a partir de documentos SQLite:

(3850) SQLITE_IOERR_LOCK

El código de error SQLITE_IOERR_LOCK es un código de error extendido para SQLITE_IOERR que indica un error de E / S en la lógica de bloqueo del archivo de aviso. Normalmente, un error SQLITE_IOERR_LOCK indica un problema al obtener un bloqueo PENDIENTE. Sin embargo, también puede indicar varios errores de bloqueo en algunos de los VFS especializados que se utilizan en Mac. Todo parece funcionar correctamente en un nivel alto (es decir, se realizan tanto las lecturas como las escrituras)

y:

Un bloqueo PENDIENTE significa que el proceso que mantiene el bloqueo desea escribir en la base de datos tan pronto como sea posible y está esperando a que se borren todos los bloqueos COMPARTIDOS actuales para que pueda obtener un bloqueo EXCLUSIVO. No se permiten nuevos bloqueos COMPARTIDOS contra la base de datos si un bloqueo PENDIENTE está activo, aunque los bloqueos COMPARTIDOS existentes pueden continuar.

Sé que la versión de SQLite ha sido actualizada por algunos lanzamientos importantes en Lollipop, por lo que soy propenso a pensar que el error se debe a un nuevo comportamiento de SQLite que no puedo aislar.

Sin embargo, todo parece funcionar bien desde un punto de vista de nivel superior (la aplicación no falla, se realizan tanto las lecturas como las escrituras, la tasa de cuadros no se reduce, al menos a ojos humanos), pero no me gustaría ignorar el problema. para lanzar la aplicación hasta que esté seguro de que no causará daños o problemas en los datos.

Tal vez me falten algunos cambios importantes en la piruleta con respecto a los bloqueos y el acceso a la base de datos de multiproceso, pero creo que es un problema que se encuentra en un nivel inferior con respecto al dominio Art / Dalvik y, por lo tanto, se debe solucionar en un contexto NDK.

¿Hay alguna forma de solucionar este problema sin distribuir una versión específica de la aplicación de SQLite? ¿Hay alguna opción manifest / SQLite para evitar el error?

Gracias por adelantado