【问题标题】:Preferences API working with multiple ClassLoaders?首选项 API 与多个 ClassLoader 一起使用?
【发布时间】:2013-07-19 07:57:25
【问题描述】:

我目前正在使用 Preferences API 在 Vaadin 应用程序中保存设置。 该应用程序在 Tomcat 服务器上运行了 3 个 WebApp。 据我所知,Tomcat 服务器上运行的每个模块都有一个 ClassLoader,但它都在一个虚拟机中运行。

谁能向我解释为什么 Java Preferences 在多个 ClassLoader 上工作?我找不到任何来源,也没有通过调试找到任何东西。

非常感谢。

【问题讨论】:

  • 不工作到底是什么意思?您确定要在多用户上下文中使用首选项吗?它更适用于桌面应用程序。
  • 无法正常工作,您启动两个应用程序,在一个应用程序中更改一些首选项并在另一个应用程序中使用 get-Methods(在不同的 JVM 中运行)并且不会显示更改(See Question 5 )。我已经实现了一个 Wrapper 类来保存用户偏好,效果很好。
  • 这不是问题 5 暗示您描述的案例不能保证有效吗?会怎样?不同的 JVM 不相互通信,那么它们如何获得更改通知?
  • 也许我问错了问题:问题不是为什么它不能在多个 JVM 上工作,而是为什么它可以与多个 ClassLoader 一起工作。抱歉,我不是母语人士。
  • 我认为与多个 ClassLoader 一起使用也不安全。您似乎看到的是您的类的三个版本使用相同的内存中 Preferences 对象(因为它们在 JVM 中)。不确定这是否是一件好事。 Tomcat 应该让它们保持隔离,而这似乎在这里崩溃了。首选项不是为并发访问而设计的数据库。

标签: java preferences


【解决方案1】:

我找到了答案:

你可以通过调用获得一个 Preferences-object:

Preferences prefs = Preferences.userRoot().node("test);

Preferences 和 PreferencesFactory 由 Bootstrap ClassLoader 加载,因此对于每个模块 (how ClassLoader work in Apache) 都是相同的,并且因为对象是在 PreferencesFactory 中创建的,所以它不是在 WebApp 上下文中创建的。

【讨论】:

    猜你喜欢
    • 2012-12-27
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 2019-05-06
    相关资源
    最近更新 更多