2012-03-21 17 views
6

Mam do czynienia z problemem, dla którego nie mam czyste rozwiązanie. Piszę aplikację Java, a aplikacja przechowuje określone dane w ograniczonym zestawie plików. Nie używamy żadnej bazy danych, tylko zwykłe pliki. Ze względu na pewne działania uruchamiane przez użytkownika niektóre pliki muszą zostać zmienione. Potrzebuję tego jako operacji "wszystko albo nic". Oznacza to, że albo wszystkie pliki są zaktualizowane, albo żaden z nich. To katastrofalne, jeśli na przykład 2 z 5 plików zostanie zmienionych, a pozostałe 3 nie z powodu jakiegoś wyjątku IOException.java - napisz dwa pliki atomicznie

Jaka jest najlepsza strategia, aby to osiągnąć? Czy osadzenie bazy danych w pamięci, takiej jak hsqldb, jest dobrym powodem do uzyskania tego rodzaju zachowania atomowości/transakcji?

Wielkie dzięki!

Odpowiedz

5

bezpiecznego podejścia IMO jest:

  1. zapasowa
  2. prowadzi wykaz przetwarzanych plików
  3. Na wyjątku przywrócić te, które zostały zrealizowane z jednej kopii zapasowej.

To zależy od tego, jak ciężkie będzie to, a także ograniczenia czasu i takie.

2

Jaka jest najlepsza strategia, aby to osiągnąć? Czy osadzenie bazy danych w pamięci, takiej jak hsqldb, jest dobrym powodem do uzyskania tego rodzaju zachowania atomowego/transakcyjnego?

Tak. Jeśli chcesz zachować transakcję, użyj dobrze przetestowanego systemu, który został zaprojektowany z myślą o tym, zamiast próbować przetaczać się na nierzetelne podłoże.


Systemy plików zasadniczo nie obsługują transakcji obejmujących wiele plików.

systemów plików NTFS i

dla systemu Windows, zwykle mają tę właściwość, że można zrobić wymianę plików atomową, więc jeśli nie można korzystać z bazy danych i

  • wszystkie pliki są w jednej stosunkowo małych katalog
  • która jest właścicielem aplikacji i
  • który jest przechowywany na jednym dysku fizycznym:

następnie można wykonać następujące czynności:

  1. Skopiuj zawartość katalogu za pomocą twardych linków.
  2. Zmodyfikuj 5 plików.
  3. atomowo zamienić zmodyfikowaną kopię katalogu z oryginalnym
1

Ive używane biblioteki transakcji Commons Apache atomowych operacji na plikach z sukcesem. Pozwala to na modyfikację plików i potencjalnie wycofanie awarii.

Oto link: http://commons.apache.org/transaction/

0

Nie możesz zablokować wszystkie pliki i zapisywać tylko do nich, gdy wszystkie pliki zostały zablokowane?

+0

Wyjątek IOException może nadal występować, nawet jeśli plik jest zablokowany? – user1284566

+0

Och, tak, masz rację. – Jonatan

1

Moje podejście polegałoby na użyciu blokady w kodzie java. Zatem tylko jeden proces mógł zapisać jakiś plik za każdym razem. Zakładam, że twoja aplikacja jest jedyną, która zapisuje pliki. Jeśli mimo to wystąpi jakiś problem z zapisem, aby "przywrócić" pliki, musisz zapisać kopię plików, na przykład sugerowaną górną.