2012-03-21 10 views
6

Me enfrenta a un problema para el que no tengo una solución limpia. Estoy escribiendo una aplicación Java y la aplicación almacena ciertos datos en un conjunto limitado de archivos. No estamos utilizando ninguna base de datos, solo archivos simples. Debido a alguna acción desencadenada por el usuario, ciertos archivos deben ser cambiados. Necesito que esto sea una operación de todo o nada. Es decir, se actualizan todos los archivos o ninguno de ellos. Es desastroso si, por ejemplo, se cambian 2 de los 5 archivos, mientras que los otros 3 no se deben a alguna excepción IOException.java - escribir dos archivos atómicamente

¿Cuál es la mejor estrategia para lograr esto? Está incrustando una base de datos en memoria, como hsqldb, una buena razón para obtener este tipo de comportamiento atómico/transaccional?

¡Muchas gracias!

Respuesta

5

Un enfoque seguro OMI es:

  1. de copia de seguridad
  2. mantener una lista de archivos procesados ​​
  3. Por excepción, restaurar los que han sido procesados ​​con la copia de seguridad.

Depende de cuán pesado va a ser y los límites de tiempo y demás.

2

¿Cuál es la mejor estrategia para lograr esto? Está incrustando una base de datos en memoria, como hsqldb, una buena razón para obtener este tipo de comportamiento atómico/transaccional?

Sí. Si desea un comportamiento transaccional, use un sistema bien probado que fue diseñado con eso en mente en lugar de tratar de rodar uno propio sobre un sustrato no confiable.


Los sistemas de archivos, por lo general, no admiten transacciones que involucran varios archivos.

que no sean Windows sistemas de archivos NTFS y tienden a tener la propiedad de que se puede hacer archivo sustitución atómica, por lo que si usted no puede utilizar una base de datos y

  • todos los archivos están bajo un razonablemente pequeño directorio
  • que posee su solicitud y
  • que se almacena en una unidad física:

entonces se podría hacer lo siguiente:

  1. Copie el contenido del directorio utilizando enlaces duros, según corresponda.
  2. Modifique los 5 archivos.
  3. intercambie Atómicamente la copia modificada del directorio con el original
1

he utilizado la biblioteca transacciones Commons Apache para operaciones de archivo atómicas con éxito. Esto le permite modificar archivos de forma transaccional y potencialmente revertir fallas.

Aquí hay un enlace: http://commons.apache.org/transaction/

0

¿No puedes bloquear todos los archivos y sólo escribir en ellos una vez que todos los archivos se han bloqueado?

+0

IOException aún puede ocurrir incluso si el archivo está bloqueado? – user1284566

+0

Oh, sí, tienes razón. – Jonatan

1

Mi enfoque sería usar un candado, en su código java. Entonces, solo un proceso podría escribir algún archivo en cada momento. Supongo que su aplicación es la única que escribe los archivos. Si aun así se produce algún problema de escritura para "deshacer" sus archivos, necesita guardar una copia de los archivos como superior sugerida.

Cuestiones relacionadas