2010-07-09 14 views
5

Gente Estoy implementando una cola basada en archivos (see my earlier question) usando sqlite. Tengo los siguientes subprocesos ejecutándose en segundo plano:conexión de base de datos sqlite/pregunta de bloqueo

  1. thread-1 para vaciar una estructura de memoria en la tabla "queue" (una inserción en la tabla "queue").
  2. thread-1 para leer y "procesar" la tabla "queue" se ejecuta cada 5 a 10 segundos
  3. thread-3 - se ejecuta con poca frecuencia y borra datos antiguos que ya no se necesitan de la tabla "queue" y también funciona en vacío, por lo que el tamaño del archivo de la base de datos sigue siendo pequeño.

Ahora el comportamiento que me gustaría es que cada hilo obtenga el bloqueo que necesita (esperando con un tiempo de espera si es posible) y luego completa la transacción. Está bien si los hilos no se ejecutan simultáneamente: lo importante es que la transacción una vez que comience no falla debido a errores de "bloqueo" como "la base de datos está bloqueada".

Miré transaction documentation pero no parece haber un recurso de "tiempo de espera" (estoy usando JDBC). ¿Se puede configurar el tiempo de espera en una gran cantidad en la conexión?

Una solución (no probada) que puedo pensar es tener un grupo de conexión de conexión de 1 máximo. Por lo tanto, solo se puede conectar un hilo por vez, por lo que no deberíamos ver ningún error de bloqueo. ¿Hay mejores formas?

Gracias!

Respuesta

2

Si fuera yo, usaría un solo identificador de conexión de base de datos. Si un subproceso lo necesita, puede asignarlo dentro de una sección crítica (o mutex, o similar) - esto es básicamente un grupo de conexión de un hombre pobre con una sola conexión en el grupo :) Puede hacer sus negocios con el databse. Cuando termina, sale de la sección crítica (o libera el mutex o?). No obtendrá errores de bloqueo si usa cuidadosamente la conexión db única.

-Don

+0

Gracias Don, eso es lo que yo podría terminar haciendo a pesar de su creación a través de una piscina db manera sería más "estándar" de hacerlo (y menos confuso ya que se está tratando el sqlite al igual que otras bases de datos en el código. – serverman

Cuestiones relacionadas