2012-03-21 2 views
6

깨끗한 해결책이없는 문제가 있습니다. 나는 Java 응용 프로그램을 작성 중이며 응용 프로그램은 제한된 파일 세트에 특정 데이터를 저장합니다. 우리는 데이터베이스를 사용하지 않고 일반 파일 만 사용합니다. 일부 사용자가 실행 한 작업으로 인해 특정 파일을 변경해야합니다. 나는 이것이 전부 또는 전무가되는 조작이 필요하다. 즉, 모든 파일이 업데이트되거나 둘 중 하나만 업데이트됩니다. 예를 들어 5 개의 파일 중 2 개가 변경되는 동안 다른 3 개는 IOException으로 인해 발생하지 않으면 재앙입니다.java - 두 파일을 원자 적으로 작성하십시오.

이 작업을 수행하는 가장 좋은 전략은 무엇입니까? 이러한 종류의 원 자성/트랜잭션 동작을 얻는 좋은 이유는 hsqldb와 같은 메모리 내장 데이터베이스를 포함하고 있습니까?

고맙습니다.

답변

5

안전한 방법은 IMO입니다 :

  1. 백업
  2. 이 처리 된 파일 예외에
  3. 의 목록을 유지 백업 하나 처리 된 사람을 복원합니다.

시간이 얼마나 걸릴지와 시간 제한 등에 달려 있습니다.

2

이 작업을 수행하는 가장 좋은 전략은 무엇입니까? 이런 종류의 원 자성/트랜잭션 동작을 얻는 좋은 이유는 hsqldb와 같은 메모리 내장 데이터베이스를 포함하고 있습니까?

예. 트랜잭션 동작을 원한다면 신뢰할 수없는 기판 위에 자신을 굴리는 대신 마음에두고 설계된 잘 테스트 된 시스템을 사용하십시오.


파일 시스템은 일반적으로 여러 파일과 관련된 트랜잭션을 지원하지 않습니다.

비 윈도우 파일 시스템과 NTFS는 모든 파일을 데이터베이스 및

  • 을 사용할 수 없습니다, 그래서 만약 당신이 원자 파일을 교체 할 수있는 특성을 가지고 합리적으로 작은 하나에있는 경향이있다 디렉토리
  • 응용 프로그램이 소유
  • 와 하나 개의 물리적 드라이브에 저장
  • :

후 다음 작업을 수행 할 수 있습니다 :

  1. 적절하게 하드 링크를 사용하여 디렉토리 내용을 복사하십시오.
  2. 5 개의 파일을 수정하십시오.
  3. 은 원자 성공 원자 파일 작업에 대한 아파치 평민 거래 라이브러리를 사용하는 원래
1

필자와 디렉토리의 수정 된 사본을 교환합니다. 이를 통해 파일을 트랜잭션 방식으로 수정하고 잠재적으로 실패시 롤백 할 수 있습니다.여기

는 링크입니다 : http://commons.apache.org/transaction/ 한 번 모든 파일이 잠겨 된 모든 파일을 잠글 만 그들에게 쓸 수 없습니다

0

?

+0

파일이 잠겨 있어도 IOException이 여전히 발생할 수 있습니까? – user1284566

+0

오, 네 말이 맞아. – Jonatan

1

내 접근 방식은 Java 코드에서 잠금을 사용하는 것입니다. 따라서 한 번에 하나의 프로세스 만 파일을 작성할 수 있습니다. 난 당신의 응용 프로그램이 파일을 쓰는 유일한 가정합니다. 파일을 "롤백"하기 위해 일부 쓰기 문제가 발생하는 경우 상단 제안과 같은 파일 사본을 저장해야합니다.

관련 문제