2012-09-13 38 views
7

Tengo el siguiente problema: Dos instancias de una aplicación en dos sistemas diferentes deben compartir una pequeña base de datos. El principal problema es que ambos sistemas solo pueden intercambiar datos a través de una carpeta de red. No tengo la posibilidad de configurar un servidor de base de datos en alguna parte.H2 Conexiones múltiples a la base de datos

¿Es posible colocar una base de datos H2 en la carpeta de red y permitir que ambas instancias se conecten a la base de datos (también concurrentemente)?

Podría conectar con ambas instancias a la base de datos utilizando el modo incrustado si desactivo el bloqueo de archivos, ¿no? Las instancias pueden ejecutar las operaciones LEER o INSERTAR en la base de datos. ¿Me arriesgo a la corrupción de datos usando múltiples conexiones integradas concurrentes?

Respuesta

2

From H2 documentation:

También es posible abrir la base de datos sin el bloqueo de archivos; en este caso , depende de la aplicación proteger los archivos de la base de datos. Si no lo hace, se dañará la base de datos.

creo que si su uso de la aplicación siempre la misma configuración (base de datos de archivos compartidos en la carpeta de red), es necesario crear una capa de aplicación que maneja la concurrencia

+0

leí esto ya, pero también leí algo acerca de la compatibilidad de bloqueo a nivel de tabla. ¿Estoy seguro de que el bloqueo de la tabla solo se usa en el modo cliente/servidor? Para múltiples conexiones integradas, ¿implementar mi propio mecanismo de bloqueo es la única opción? – Dirk

+0

si puede ejecutar un servidor, administra el bloqueo de nivel de tabla. Pero sin ello, debe implementar su propio mecanismo –

+1

En realidad, los bloqueos a nivel de tabla se usan por defecto incluso en el modo incrustado y en memoria, si abre más de una conexión a la base de datos (dentro del mismo proceso). –

21

que tenía el mismo problema y he encontrado la solución en la documentación. Se puede encontrar en; http://h2database.com/html/features.html#auto_mixed_mode

Múltiples procesos pueden acceder a la misma base de datos sin tener que iniciar el servidor manualmente. Para hacer eso, añada; AUTO_SERVER = TRUE a la URL de la base de datos. Puede usar la misma URL de base de datos independientemente de si la base de datos ya está abierta o no. Esta función no funciona con bases de datos en memoria.

// Application 1: 
DriverManager.getConnection("jdbc:h2:/data/test;AUTO_SERVER=TRUE"); 

// Application 2: 
DriverManager.getConnection("jdbc:h2:/data/test;AUTO_SERVER=TRUE"); 
Cuestiones relacionadas