Java 持久性应用程序无状态与有状态
Posted
技术标签:
【中文标题】Java 持久性应用程序无状态与有状态【英文标题】:Java Persistance Application Stateless vs. Stateful 【发布时间】:2011-06-19 20:01:49 【问题描述】:我是JPA新手,不明白无状态和有状态的用法和区别。
有什么经验吗?
问候, 海瑟姆
【问题讨论】:
【参考方案1】:Stateless 和 Stateful 是 EJB 会话 Bean 概念,而不是 JPA。
注意事项: JPA 是 EJB 规范的一部分,但可以在 EJB 容器之外单独使用。这通常是造成混乱的原因。
已编辑:一个有用的 SO 线程,Why Use Stateful Session Beans。
【讨论】:
+1:简洁,但正确。应该注意的是,JPA 是 EJB 规范的一部分,但可以在 EJB 容器之外单独使用。这就是造成混乱的原因。 谢谢,darioo,您的建议已添加到帖子中。 :)【参考方案2】:Stateful 和 Stateless 是 EJB's(Java EE 容器管理的会话 Bean)的属性,而不是 JPA 规范的任何特定属性。对于来自同一客户端的每个请求,Stateful bean 将具有与之关联的状态。 Stateless bean 没有特定于客户端的状态,单个实例可以在多个客户端请求之间并发使用,线程安全。
JPA 是一种可用于持久化有状态 bean 的持久化策略(我猜你也可以直接使用 JDBC,或者插入一些其他持久化策略)。
【讨论】:
【参考方案3】:“有状态”和“无状态”是会话 bean 的属性。
会话 bean(简而言之)提供了一种调用应用程序服务器上的方法的方法。 bean 是 java 类的一个实例。通常,bean 在远程方法终止(并返回结果)后被销毁。这些 bean 是“无状态的”。
可以(但不常见)向 bean 添加字段和属性,以便客户端可以在服务器上“创建”此实例并将其用于多个操作。这些 bean 是“有状态的”(应该避免)。
【讨论】:
购物车应用程序中不使用有状态会话 bean 吗?那么...如果至少有一个用例,为什么要避免使用有状态 bean?【参考方案4】:我认为部分混淆在于 Java Persistence API 是 EJB3 规范的一部分,有时似乎可以与 EJB 互换使用。直到我第一次接触 Pro EJB 3:Java Persistence API,我才真正理解这一点。看看http://en.wikipedia.org/wiki/Enterprise_JavaBean,它似乎对这个主题提供了一个很好的概述。
【讨论】:
【参考方案5】:基本上,如您所知,Java 会编译内容,然后您在运行时看到应用程序,如果在类加载器之后一切顺利并避免执行阶段错误等等,当您将变量、对象等存储在任何像 RAM 或数据库这样的地方,当用户与您的应用程序交互时,这些数据可能会发生变化,然后您开发了一个有状态的应用程序,如果您认为代码逻辑中没有什么是动态的(可以重塑应用程序行为的东西),那么您将开发无状态应用程序。
简而言之,有状态的应用程序意味着您的类属性在运行时动态变化。
【讨论】:
以上是关于Java 持久性应用程序无状态与有状态的主要内容,如果未能解决你的问题,请参考以下文章