2012-07-31 36 views
11

Tengo una aplicación que usa SQLite (versión 3.7.2) para almacenar datos. Tengo una conexión SQLite compartida entre varios hilos que escribe y lee desde el mismo SQLite db. SQLite se compila con DSQLITE_THREADSAFE = 1, lo que significa que SQLite está en modo Serialized.SQLite: Compartir conexiones entre hilos para leer y escribir

Citando de SQLite docs

Serialized: En el modo de serie, SQLite puede usarse con seguridad por múltiples hilos sin restricción.

Por el contrario la entrada SQLite Wiki dice

No utilice la misma conexión de base de datos al mismo tiempo en más de un hilo

Probé con una aplicación de ejemplo que desova cientos de subprocesos y comparte un identificador de SQLite para leer & escribe que funciona bien.

¿La entrada del wiki de SQLite está desactualizada o SQLite podría no ser capaz de manejar la lectura y escritura de diferentes hilos al mismo tiempo utilizando la misma conexión?

Respuesta

7

EDITAR

DSQLITE_THREADSAFE = 2: modo multi-hilo El término "multi-hilo" es un poco confundido en SQLite. Parece que en el modo Multi-hilo no puede compartir una conexión con otros hilos porque la conexión en sí no usará mutexes para evitar que un hilo modifique la conexión mientras otro hilo lo está usando.

DSQLITE_THREADSAFE = 1: Modo serializado Sin embargo, en el modo serializado, se bloqueará el archivo de datos y utilizará mutex para controlar el acceso de la conexión compartida. ... cuando SQLite se compila con SQLITE_THREADSAFE = 1, la biblioteca SQLite serializará el acceso a las conexiones de base de datos y las declaraciones preparadas para que la aplicación pueda usar libremente la misma conexión de base de datos o la misma declaración preparada en diferentes hilos al mismo tiempo.

Por lo tanto, cuando se trata de conexiones, modo serializado es flujos seguros pero multi-hilo modo no es, aunque aún puede tener múltiples conexiones a la misma base de datos.

Fuente: http://www.sqlite.org/c3ref/c_config_getmalloc.html#sqliteconfigmultithread

Saludos!

+2

Lo leí, pero me preguntaba si la wiki estaba desactualizada o si la conexión SQLite ahora admite 'lecturas' y' escrituras' de la misma conexión desde múltiples hilos. – omggs

+0

@omggs tienes razón. Los términos son un poco confusos en los documentos de SQLite. Para mí * multi-hilo * y * serializado * era el mismo, pero no lo son. Utilizo conexiones serializadas pero no las he compartido entre hilos ... y ahora aprendí que es seguro compartir :) – devundef

+1

¡Gracias por confirmar! ¡La wiki de SQLite está obsoleta! – omggs

0

que es una mala idea para compartir una conexión entre más de un hilo cuando se tiene DSQLITE_THREADSAFE = 0

Imagínese el hilo 1 es la ejecución de este código:

1. connection.setAutoCommit(false); 
2. statement.executeUpdate(sql); 
3. connection.commit(); 

y el hilo 2 está ejecutando este código al mismo tiempo:

1. connection.setAutoCommit(true); 

Ahora lo que si la instrucción 1 de rosca 2 se ejecuta exactamente antes de la operación 3 de hilo 1? Probablemente obtendrá una SQLException con el mensaje "base de datos en modo autocompromiso" (ya que los métodos de confirmación automática se ejecutan en el mismo objeto de conexión).

Esto significa que uno debe sincronizar su código de mineral de uso DSQLITE_THREADSAFE = 1

El uso de la agrupación de conexiones también sería el mejor si estás código develope multi-hilo que va desde donde se puede obtener un mejor rendimiento cuando se decide optar por otra DBMS.

Cuestiones relacionadas