申请状态在哪里?

时间:2012-09-23 09:06:37

标签: java state layer creation performance

在代码中我最好把对象创建(有状态对象)放在哪里?在什么层?

例如,我曾经在Hibernate DAO类中放置了一个对象引用,并且我被告知这是不正确的,因为DAO类不应该具有状态。州应该在'服务层'内。

有人告诉我,我不应该在重复的方法调用(如UpdateCart())上创建新对象。创建对象代价高昂,不应该随处可见代码。它应该只在初始化类型方法中。例如,如果电子商务应用程序需要购物车,请将其放入会话中。如果需要一些通用主对象,请将其放入初始化代码中。在那里创建它,让应用程序的其余部分稍后访问它的实例。不要在每次通话时创建此实例。

我对这整个设计原则感到困惑。我听到的最奇怪的事情是“应用程序不应该有状态。状态应保存在数据库所在的数据层中。真?我对这些设计概念很陌生,我不知道在哪里可以看到它以获得更多的教育。 GoF的?设计模式书籍?目标是创建定性代码(即在业务中使用)。

由于

2 个答案:

答案 0 :(得分:2)

良好的做法可以根据项目的类型而有所不同。

对于大多数项目,创建对象对CPU来说并不昂贵。不总是很好地表达的成本是设计的成本。您的应用程序似乎有一种设计方法,其中所有状态和对象都需要以受控和集中的方式进行管理。通常这样做是为了提高可维护性并简化设计。我不认为你应该只知道设计是什么,除非它已经非常清楚地告诉你。

我怀疑团队的其他成员习惯于以特定的方式工作,并且不认为他们应该记录或教你这种方法,只要告诉你什么时候“错误”。这不是高效的恕我直言,但你必须处理你所拥有的情况,并在涉及状态或数据结构的位置时问他们。

答案 1 :(得分:1)

  

'应用程序不应该有状态。状态应保存在数据库为“

”的数据层中

有些设计是常态,恰当地称为“无状态架构”。每个建筑是否应该是无国籍的当然是值得怀疑的,而且这个术语也许也会引发争论。

大多数“无国籍”应用程序实际上都有状态,但正如上面的规则所述(没有双关语),这个状态保存在一个全球的地方;数据库。正如彼得所提到的,其原因可能是可维护性和简化性,但也常常听说这是scalability。如果没有状态出现在数据库中的任何地方,那么可以很容易地添加额外的前端服务器,处理服务器以及你有什么。

虽然这确实有一些优点,但我认为我们必须区分临时状态和权威状态。

临时状态可以是您在订购过程中所处的位置以及您已输入的详细信息。在Java EE中,您可以将其保留在例如Java EE中。 @ConversationScoped bean,或@Stateful bean。因此,这表示您保留在Web层内。业务层。

这样做的好处是易于使用,性能和卸载单个中央数据库。当然,您也可以将临时状态存储在中央数据库中,但是您可能希望将其与常规的非临时数据保持一致,这意味着需要一些额外的编程复杂性。从Web层检索数据通常要快得多,并且它会从数据库中删除一些负载。

在许多系统中,只有一个主数据库(一个接受写入的数据库),因此这个单一数据库可能成为该设置的一个巨大瓶颈。

根据您的实际架构和设置,在数据库中保留临时状态 - 可能 - 实际上提高了您的扩展能力。

缺点是您确实需要您的客户端坚持当前保留临时状态的单个服务器。这通常称为“粘性会话”。如果此客户端与之交互的一台服务器出现故障或需要重新启动或其他任何服务器,则客户端将丢失此临时数据。有一些方案,比如将状态复制到集群中的所有节点或附近的节点(伙伴复制),但这会使事情再次变得复杂并且可能使网络过载(如果所有节点不断地相互复制)。

权威状态表示它表示作为唯一信息来源的共享数据。这种状态是我们几乎总希望在中心位置的状态,但有时您会看到它存储在例如中央位置。一个网络节点。

例如,假设我们有一个最近价格列表,而不是将其保存到中心位置,而是将其保存在输入它的Web节点上。现在有一个“唯一的”Web节点的概念,它具有此信息,其他服务器可能开始假设只有这个“唯一的”Web节点。现在添加额外的节点是不可能的,因为它打破了这个假设。