java.util.Prefs throw BackingStoreException - Why?

2022-09-02 04:44:02

我有一个系统,可以缓存启动时SOAP调用的微小/简单结果

我需要实例能够在启动时重新加载其缓存(以防 SOAP 服务失效),并且还处理使用此缓存文件的多个实例的可能性

我选择使用,但Java的内置自动同步线程间歇性地失败(1%的时间使用默认的JVM 30s后备存储同步)转储以下异常:java.util.prefs

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共享这个后备商店,尽管这似乎没有发生在我们的其他机器上。

任何人都可以证实这一点吗?如果有的话,有哪些风险?

如果我的方法有缺陷,我应该使用什么作为替代方案?


答案 1

“我现在怀疑这可能是因为我们有多个JVM共享这个后备商店”

这绝对可能是事实!如果两个 JVM 尝试同时锁定文件,那么您将看到这种情况。

确切的细节将取决于锁的类型,操作系统和文件系统。

您可能希望尝试将导致此操作的操作包装在 try/catch 块中,如果操作失败,则重试该操作。


答案 2

我在码头遇到了同样的问题。我发现以下修复了这个问题。

将 添加到 JRE 目录,并向正在运行正在投诉的进程的用户提供访问权限。.systemPrefs

完成后,转到Jetty目录并打开文件start.ini

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

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

添加完这些行后,我重新启动了码头,发现错误消失了。


推荐