2010-01-08 4 views
17

시동시 SOAP 호출의 작고 단순한 결과를 캐시하는 시스템이 있습니다.java.util.Prefs BackingStoreException를 발생시키는 이유 - 이유는 무엇입니까?

시동시 캐시를 다시로드 할 수 있어야하고 (SOAP 서비스가 작동하지 않는 경우) 해당 인스턴스를 처리 할 수 ​​있어야합니다 이 캐시 파일

를 사용하여 여러 인스턴스의 나는 java.util.prefs를 사용하기로 결정하지만, 자바의 내장 자동 동기화 스레드가 간헐적으로 다음을 제외하고 덤핑 (저장 동기화 백업 기본 JVM의 30 대 사용 시간의 1 %) 실패 :

Jan 8, 2010 12:30:07 PM java.util.prefs.FileSystemPreferences syncWorld 
WARNING: Couldn't flush user prefs: java.util.prefs.BackingStoreException: Couldn't get file lock. 

나는 의심스러운 this bug하지만 1.5 (tiger-b40)에서 수정되었으며이 상자의 java 5는 "1.5.0_16-b02"입니다.

이제 다른 시스템에서 발생하지는 않지만이 Backing Store를 공유하는 JVM이 여러 개 있다고 생각됩니다.

누구든지 확인할 수 있습니까? 위험 요소는 무엇입니까?

내 접근 방식에 결함이있는 경우 대안으로 사용해야하는 것은 무엇입니까?

+2

일부 코드는 우리가 추측하기를 기대하지 마십시오 – Bozho

+1

동일한 파일을 사용하려고하는 여러 JVM을 갖는 것과 관련이있는 것 같습니다.사람들은 여러 프로세스에서 동시에 데이터를 공유하고 수정할 수있는 중앙 집중식 데이터베이스를 데이터베이스를 사용하는 경향이 있습니다. – BryanD

+2

'java.util.prefs' API는 칠면조입니다. 저는 그것을 무시하고 다른 사람들이 데이터베이스처럼 실제로 사용하는 것을 사용하는 것이 좋습니다. – skaffman

답변

8

절대적 경우가 될 수

이 "지금은 우리가 여러의 JVM이 백업 저장소를 공유하고 있기 때문에이 될 수 있다는 생각"! 두 개의 JVM이 동시에 파일을 잠그려고하면 다음과 같은 메시지가 표시됩니다.

정확한 세부 정보는 잠금 장치, 운영 체제 및 파일 시스템의 유형에 따라 다릅니다.

try/catch 블록에서이 문제를 일으키는 작업을 래핑 한 다음 실패 할 경우 작업을 다시 시도 할 수 있습니다.

+3

답장을 보내 주셔서 감사합니다. 유감스럽게도 문제는 Java 환경 설정의 동기화 스레드가 우리 제어 범위를 벗어나서 예외를 잡을 수 없다는 것입니다. 좋은 비판은 여기에 : http://www.allaboutbalance.com/articles/disableprefs/ – HaveAGuess

0

환경 설정을 사용하는 대신 모든 직렬화 가능 맵을 사용하고 무작위로 생성 된 임시 파일 이름 (첫 번째 초기화시 생성되는 파일 이름)으로 직렬화 및 비 직렬화하는 매우 간단한 캐시 클래스를 만듭니다. 캐시 일 뿐이므로 예외가 발생하면 예외를 catch하고 초기 상태로 다시 설정하여 원본 데이터 소스 (사례의 SOAP 서비스)에서 다시 가져옵니다. 그러므로 원하지 않는다면 serialVersionUID 또는 해당 호환성 항목에 대해 걱정할 필요가 없습니다.

+0

문제는 내가 시작할 때 자신의 캐시를 다시로드 할 수 있도록 인스턴스가 필요합니다 (SOAP 서비스가 작동하지 않는 경우) 그리고 여러 개의 가능성을 처리합니다. 이 캐시 파일을 사용하는 인스턴스 OP – HaveAGuess

0

부두와 동일한 문제가 발생했습니다. 다음과 같은 문제가 해결되었습니다.

.systemPrefs을 JRE 디렉토리에 추가하고 불평하는 프로세스를 실행중인 사용자에게 액세스 권한을 제공하십시오. 이 작업이 완료되면

, 부두 디렉토리로 이동하여 start.ini 파일

을 열 - Djava.util.prefs.userRoot={user's home directory}

-

Djava.util.prefs.systemRoot={user's home directory} 일단 내가 부두를 다시 시작 그 라인 추가를 완료하고 오류가 사라진 것을 발견했다 .

+0

에 추가 할 것입니다. 특정 JRE가 사용하는 저장소를 변경하여 작동하는 것으로 추측합니다. 실행중인 다른 JRE와의 충돌을 피하기 위해서입니다. 공유 해줘서 고마워. – HaveAGuess

관련 문제