2011-07-13 24 views
28

Tengo una base de datos con algunas tablas. Quiero actualizar las tablas usando múltiples hilos. Usaré la misma instancia de SQLiteDatabase en todos los hilos.Es la base de datos Sqlite hilo seguro

Por favor sugiera si este enfoque es correcto. ¿La base de datos Sqlite es segura? ¿Pueden dos subprocesos diferentes actualizar la misma tabla para diferentes conjuntos de valores al mismo tiempo?

+0

posible duplicado de [¿Cuáles son las mejores prácticas para SQLite en Android?] (Http://stackoverflow.com/questions/2493331/what-are-the-best-practices-for-sqlite-on-android) –

+0

debe usar el bloqueo como se describe en https://stackoverflow.com/questions/12758655/sqlitedatabase-multi-thread-locking-pattern –

Respuesta

23

[INCORRECTO:] No, no es seguro para subprocesos de forma predeterminada. Debes usar métodos SQLiteHelper relacionados con el bloqueo para proporcionar seguridad de subprocesos.

[EDIT]: clase SQLiteDatabase proporciona un mecanismo de bloqueo por defecto (ver comentarios) y si se están ejecutando en multi-hilo, que no tiene que pensar en cambiar cualquier cosa por tener hilo de seguridad.

Búsqueda de 'hilo' en este documento: http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

y leer más en:

+11

http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html # setLockingEnabled% 28boolean% 29 'Controla si la base de datos SQLite se convierte en segura para subprocesos utilizando bloqueos alrededor de secciones críticas. Esto es bastante caro, por lo que si sabe que su base de datos solo será utilizada por un único hilo, debe establecerlo en falso. El valor predeterminado es verdadero' ... ¿No implica esto que es seguro para subprocesos por defecto? – Ryan

+1

Hmm. Debería ser y ahora estoy equivocado. Hmm. –

+1

"Este método ha quedado obsoleto en el nivel 16 de la API. Este método ahora no hace nada. No lo use." –

-2

Si lo haces ..

setLockingEnabled (booleano lockingEnabled) de control si el SQLiteDatabase está hecha de hilo de seguridad mediante el uso de cerraduras alrededor de las secciones críticas.

2

Puede controlar si su base de datos es segura para subprocesos o no por setLockingEnabled.

Controle si la base de datos SQLite está o no protegida por subprocesos utilizando bloqueos alrededor de secciones críticas. Esto es bastante caro, por lo que si sabe que su base de datos solo será utilizada por un único hilo, debe establecerlo en falso. El valor predeterminado es verdadero

Así que creo que esto responde a su pregunta.

El método setLockingEnabled se deprecia en el nivel de la API 16

+4

Obsoleto en api 16 –

3

El Android utiliza el mecanismo de bloqueo de Java para mantener el acceso de base de datos SQLite serializado. Por lo tanto, si el hilo múltiple tiene una instancia de db, siempre llama a la base de datos en forma serializada y, por supuesto, la base de datos es segura para subprocesos.

Si confirmamos que estamos utilizando la base de datos de un solo hilo, tuvimos la opción de desactivar la función de bloqueo interno de la base de datos llamando al setLockingEnable(false) pero este método obtuvo deprecated del nivel API 16 y ya no está en uso. si ve la implementación de este método en la clase SQLiteDatabase, no encontrará nada escrito, es decir, el método vacío.

public void setLockingEnabled (boolean lockingEnabled) 

Este método ahora no hace nada. No utilice.

Una cosa que debemos tener cuidado de que es que debemos hacer una instancia de la clase de ayuda (es decir, por lo que es Singleton) y compartir misma instancia de hilo múltiple y no llamar close() en la base de datos en entre la operación, de lo contrario usted puede conseguir siguiente excepción:

java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase

por lo tanto, no llame database.close() de entre el acceso a la base de datos, base de datos auto cerca realizar la operación internamente cuando toda la operación sería el final.

Cuestiones relacionadas