【问题标题】:Static variables restriction in session beans会话 bean 中的静态变量限制
【发布时间】:2012-02-26 20:09:00
【问题描述】:

不可能在会话 bean 代码中使用静态变量。这种限制是任意的还是有根据的?为什么?

最好的问候

【问题讨论】:

  • 好吧,不是不可能,试试final static

标签: java jakarta-ee distribution session-bean


【解决方案1】:

正如FAQ on EJB restrictions 中所述,使用 EJB 的限制之一是:

企业 bean 不应读取或写入非最终静态字段

discussion on static fields中进一步扩展:

非最终静态类字段在 EJB 中是不允许的,因为这些字段使企业 bean 难以或无法分发。静态类字段在特定类的所有实例之间共享,但仅在单个 Java 虚拟机 (JVM) 内共享。更新静态类字段意味着在类的所有实例之间共享该字段的值。但是,如果一个类同时在多个 JVM 中运行,则只有与更新实例在同一 JVM 中运行的那些实例才能访问新值。换句话说,如果在单个 JVM 中运行,非最终静态类字段的行为将不同于在多个 JVM 中运行。 EJB 容器保留了跨多个 JVM 分布企业 bean 的选项(在同一台服务器上运行,或在任何服务器集群上运行)。不允许使用非最终静态类字段,因为企业 bean 实例的行为取决于它们是否分布。

如果这些字段被标记为最终字段,则使用静态类字段是可接受的做法。由于 final 字段无法更新,企业 bean 的实例可以由容器分发,而无需担心这些字段的值会变得不同步。

【讨论】:

  • 不错的答案。不幸的是,链接已损坏。
  • 那么静态最终集合呢?他们也被允许吗?
  • @botchniaque 更糟糕的是,除非您将其设为不可修改,否则所有线程都可以更改集合,从而导致进一步的问题
  • 我就是这么想的,为什么 EJB 规范提到对nonfinal static fields 的限制,而不是对nonfinal static primitives AND any static complex types?这有点误导。
【解决方案2】:

这是基本的。按照这个sun documenation

非最终静态类字段在 EJB 中是不允许的,因为这些字段会使企业 bean 难以或无法分发。静态类字段在特定类的所有实例之间共享,但仅在单个 Java 虚拟机 (JVM) 内共享。 *

【讨论】:

  • 在无状态会话 bean 中,如果我的代码调用 Resources.getSingleton(),并且返回一个静态 Resources 对象,那也是不行吗?
【解决方案3】:

static 表示类或所有对象的唯一性。

现在,javabeans 应该有用户特定的数据,static 字段对这些没有任何意义。

一个用户编辑一个变量,它也会为所有其他用户更新。 (免费 :-))。

但是,如果您想要这些的静态行为(即为所有用户使用相同的数据),您可以使用 application 来实现此目的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 2013-01-26
    • 1970-01-01
    • 2019-08-24
    • 2012-12-19
    • 2011-10-17
    相关资源
    最近更新 更多