java.util.Prefs 抛出 BackingStoreException - 为什么?

问题描述 投票:0回答:4

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

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

我选择使用

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

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 共享这个后备存储,尽管这似乎不会发生在我们的其他机器上。

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

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

java preferences
4个回答
11
投票

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

这绝对有可能是这样! 如果两个 JVM 尝试同时锁定文件,那么您将看到以下内容。

具体细节取决于锁的类型、操作系统和文件系统。

您可能想尝试将导致此问题的操作包装在 try/catch 块中,然后在失败时重试该操作。


1
投票

我在码头遇到了同样的问题。我发现以下解决了问题。

.systemPrefs
添加到您的 JRE 目录,并为正在运行抱怨进程的用户提供访问权限。

完成后,转到 Jetty 目录并打开

start.ini
文件

-

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

-

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

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


0
投票

不使用首选项,只需使用任何可序列化的映射并创建一个非常简单的缓存类,将其序列化和反序列化为随机生成的临时文件名(该文件名在第一次初始化时生成)。由于它只是一个缓存,因此您可以捕获任何异常,并在异常发生时将缓存重置回其初始状态,因此它将从原始数据源(在您的情况下为 SOAP 服务)重新获取。因此,如果您不想,则无需担心serialVersionUID或任何兼容性问题。


0
投票

要将 /etc/.java/.systemPrefs 文件夹的所有权更改为您的用户,如下所示:

sudo chown 777 user .systemPrefs/
© www.soinside.com 2019 - 2024. All rights reserved.