当前位置: 首页 > 知识库问答 >
问题:

单例会话bean

赵涵亮
2023-03-14

>

在EJB3.0及其之前的版本中,该问题是如何处理的?

如果它保留了客户端特定的会话状态,那么单个实例将拥有所有客户端(试图并发访问)的特定数据?它会安全吗??

如果我们可以在其他会话bean中使用静态最终变量和静态初始值设定项块或静态方法来初始化它们(因为静态变量也是每个类的数据,而不是每个实例的数据),以便跨bean共享公共数据,那么单例会话bean需要什么呢?

在singleton中使用业务方法是一个好的设计吗??如果是这样,由单个实例服务的客户端请求的响应时间将比由多个实例服务的客户端请求的响应时间多得多。

此外,虽然singleton bean允许多个客户机并发访问单个bean实例,但默认并发类型(容器管理)中的默认锁类型(写锁)将阻止所有其他线程访问bean,直到该方法结束,这似乎是一个缺点,对吗??

如果有人能给出一个明确的答案,那将是非常有帮助的

提前感谢:)

共有1个答案

翟越
2023-03-14

>

  • 是的。

    通常数据存储在静态变量中。静态变量不太好,原因有很多,包括单元测试。此外,静态变量需要某种同步,严格读取EJB规范不允许这样做,尽管在实践中它运行良好。

    通常,存储在单例中的状态不是特定于客户端的,而是特定于应用程序的。例如,缓存全局配置状态或缓存数据库中的全局状态,可能使用周期性非持久性计时器进行刷新。

    没有,但请看第二条。

    不,单例bean可能不适合基于请求的业务逻辑。是的,默认值是带有写锁的容器并发,因此一次只能有一个线程。您应该根据需要使用@Lock(READ)@ConcurrencyManagement(BEAN)

    如#3中所述,通常需要跨所有bean共享的“全局”应用程序状态。我发现单例会话bean对于应用程序配置和管理应用程序范围的定时器很有用。

  •  类似资料:
    • 如果使用EJB3单例会话Bean,那么让ConcurrentHashMap状态变量-correct没有意义?我可以只使用一个由容器并发管理器管理的常规HashMap?

    • 我不知道这是否是实现我的解决方案的更好方法: 该类是可序列化的,因为我从数据库的Json中获取内容,并将内容映射到对象GetFromJson中(我只需要在数据库中执行一次查询)。因为这个原因,我需要在我所有的应用程序中使用对象,因为这个原因,我认为我需要使用一个单例 有人给我发布了一个库来从数据库中获取JSON。JSON对象解析为,因此我创建了我的类。 现在我有很多rest服务,在我的rest服务

    • 我是EJB的新手,最近开始研究EJB(3.0)。我已经使用Java6年了,但以前从未使用过EJB。至少可以说,整个EJB业务的复杂性让我不知所措。我不明白我可以在哪里实际应用一些概念。 在理解无状态会话bean后,我想到的一个问题是,你能不能不要总是用一个没有本地成员的类的共享实例来替换无状态会话bean(实际上使其无状态)?我了解到正在为无状态会话bean进行实例池。如果没有状态,就不能简单地使

    • 我与一位同事讨论了单例会话bean中的并发管理。根据我的理解,在阅读了Oracle文档之后,如果您取消了注释,那么它默认为容器管理的并发。在文档中,它说明了以下关于容器管理的单例会话bean的内容: javax.ejb.Lock注释和javax.ejb.LockType类型用于指定单例业务方法或@Timeout方法的访问级别。 和 如果singleton类上不存在@Lock注释,则默认的锁类型@L

    • 问题内容: 我刚刚在Google AppEngine / Java + GWT应用程序中启用了Session。以及如何使用它?我如何获得会话ID并从中播放所有好东西?是否有任何简单的登录页面的真实示例,我只是输入LoginName和Password,然后通过RPC调用转到服务器,针对数据库进行身份验证并将Session ID发送回客户端。 我已经有以下代码,但不知道下一步该怎么做: GWT登录表单

    • 我正在再次浏览Javaee7 oracle文档,下面是所述内容。 “单个会话bean在每个应用程序中实例化一次,并在应用程序的生命周期内存在。单个会话bean是为单个企业bean实例在客户端之间共享并由客户端并发访问的情况而设计的。” 我完全明白它在说什么。然而,仔细想想,session这个词在这里是非常误导人的。由于它存在于应用程序级别,“会话”一词在这里似乎不适用。 当我想到会话这个词时,我认