2011-03-09 10 views
22

Tengo una aplicación que tiene 2 partes.Manejo de base de datos con 2 procesos

  • Un servicio que crea contenido.
  • Una aplicación que utiliza el contenido

Cada uno de éstos se ejecutan como procesos diferentes. El problema es que ambos comparten una base de datos. Y frecuentemente obtengo un error bloqueado en la base de datos, tanto cuando el servicio intenta escribir algo como cuando la IU está leyendo datos. También viceversa. ¿Cómo hacerlo?

  • La clase utilizada para acceder a DB es una clase singleton. Pero dado que tanto UI & el servicio son 2 procesos diferentes, supongo que hay 2 singletons. Entonces eso no ayuda.
  • Incluso synchronise supongo que no será de ayuda, ya que una vez más debido a 2 procesos diferentes.
  • Content Providers quizás una opción, pero como utilizo consultas complejas para cavar información, sería muy difícil usar eso también.

Cómo hago para que los dos procesos compartan la base de datos. Cualquier señal sería muy apreciada.

+0

me pueden orientar sobre cómo usar berkeley db. – Kishore

Respuesta

7

El uso de un proveedor de contenido es una opción. Otra es echar un vistazo a Berkeley DB. El BDB SQL API es compatible con SQLite y el administrador de bloqueos BDB permite que varios hilos y/o procesos lean/escriban en la base de datos al mismo tiempo.

+0

Suena interesante. He estado buscando información sobre esto. Hay 2 opciones BDB y BDB SQL, y obviamente estoy interesado en esto último. Pero parece que necesitamos construir la fuente y actualizar la ROM para la versión SQL. – Codevalley

+0

Los foros de OTN son un buen lugar para comenzar: http://bit.ly/eIREhr Sí, creo que deberá compilar la fuente. Le pedí a alguien que haga un seguimiento de su pregunta en el foro OTN. – dsegleau

+0

Este enlace también es un buen lugar para comenzar: http://bit.ly/hb7wlC – dsegleau

3

cerrar la conexión después de cada operación

detectar el error de base de datos bloqueada y tratar de volver a conectar después de 50 ms

o dejar que el servicio de manejar la base de datos y la actividad piden el servicio de datos

puede estar allí isDatabaseInUseMethod?

+0

Bueno, seguro que no hay 'isDatabaseInUse' o similar en mi conocimiento. Y dado que el Servicio y la Actividad son procesos diferentes, las llamadas de Procedimiento entre ellos no son fáciles. – Codevalley

+3

sí, pero aún puede detectar la excepción y repetir la consulta. Haga una instrucción while alrededor. Se ejecutará tan pronto como el otro proceso cierre su conexión. Haga lo mismo en ambos y ellos cambiarán las conexiones – sherif

+0

-1. Hay tantas cosas mal aquí. Esto esencialmente intenta ignorar el problema para el que se inventaron cosas como mutexes.No hay garantía de que el único proceso lo suelte a una velocidad razonable, se supone que las excepciones son ... la excepción, no la regla, y el sondeo es algo que debe evitarse en general. Por favor investigue sobre una solución real. – NargothBond

1

Debe usar un proveedor de contenido para canalizar sus consultas de base de datos a través de una fuente. Dentro del proveedor de contenido puede usar cualquier mecanismo de bloqueo que desee para asegurarse de no tener acceso concurrente. También puede pensar en usar observadores de contenido para coordinar acciones de servicio con cambios en la base de datos.

+0

Cavé en esas líneas. No se pudo obtener una aplicación de muestra en 'ContentProviders'. Además, ¿podemos usarlo sin 'ContentObservers'? – Codevalley

+0

Sí, puede usarlo sin contentobservers. Los observadores solo se encargan de notificar los cambios, pero tienes que activarlos manualmente, para que puedas ignorarlos si quieres. –

Cuestiones relacionadas