Java.util.Prefs throwing BackingStoreException - Почему?

У меня есть система, которая кэширует крошечные/простые результаты вызова SOAP при запуске

Мне нужны экземпляры, чтобы перезагрузить их кеш при запуске (в случае, если служба SOAP мертва) и ТАКЖЕ обрабатывают возможность использования нескольких экземпляров с использованием этого файла кэша

Я выбрал использовать java.util.prefs, но встроенный в автоматическую синхронизацию поток Java прерывается с ошибкой (1% времени с использованием синхронизации хранилища по умолчанию JVM 30s), сбрасывая следующее исключение:

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.

Я подозревал эту ошибку, но это было исправлено в 1.5 (tiger-b40), а наш java 5 в этом поле "1.5.0_16- b02".

Теперь я подозреваю, что это может быть потому, что у нас есть несколько JVM, которые используют этот Backing Store, хотя это, похоже, не происходит на наших других машинах.

Может ли кто-нибудь подтвердить это? Каковы риски, если таковые имеются?

Если мой подход ошибочен, что я должен использовать в качестве альтернативы?

Ответы

Ответ 1

"Теперь я подозреваю, что это может быть потому, что у нас есть несколько JVM, которые используют этот резервный магазин"

Это может быть абсолютно так! Если две JVM пытаются заблокировать файл в то же самое, то это то, что вы увидите.

Точные данные будут зависеть от типа блокировки, операционной системы и файловой системы.

Возможно, вы захотите попробовать выполнить операцию, которая вызывает это в блоке try/catch, а затем повторить операцию, если она терпит неудачу.

Ответ 2

Вместо использования настроек просто используйте любую сериализуемую карту и создайте очень простой класс кеша, который сериализует и десериализует его произвольно генерируемому временному имени файла (имя файла создается при первой инициализации). Поскольку это только кеш, вы можете просто перехватить любые исключения и reset кэш вернуться к своему первоначальному состоянию, когда произойдет исключение, поэтому он будет повторно извлекаться из исходного источника данных (в случае с SOAP-службой в вашем случае). Поэтому нет необходимости беспокоиться о serialVersionUID или любом из этих материалов совместимости, если вы этого не хотите.

Ответ 3

Я столкнулся с той же проблемой с причалом. Я нашел следующее исправление проблемы.

Добавьте .systemPrefs в каталог JRE и предоставите доступ к пользователю, который запускает процесс, который жалуется.

Как только это будет сделано, перейдите в каталог Jetty и откройте файл start.ini

- Djava.util.prefs.userRoot={user home directory}

- Djava.util.prefs.systemRoot={user home directory}

После завершения добавления этих строк я перезапустил причал и обнаружил, что ошибки не исчезли.