当前位置: 首页 > 面试题库 >

Java为什么将View中的Hibernate Open Session视为不良做法?

常明亮
2023-03-14
问题内容

以及你使用哪种替代策略来避免LazyLoadExceptions?

我确实了解到公开会议存在以下问题:

  • 在不同的jvm中运行的分层应用程序
  • 事务仅在最后提交,最有可能你希望在结果之前提交。

但是,如果你知道你的应用程序在单个vm上运行,为什么不通过使用开放会话视图策略来减轻痛苦呢?


问题答案:

因为从性能和理解的角度来看,在视图层中发送可能未初始化的代理(尤其是集合)并从那里触发hibernate加载可能会造成麻烦。

了解:

使用OSIV会“污染”视图层,使其与数据访问层有关。

视图层没有准备好处理HibernateException延迟加载时可能发生的事件,但是大概是数据访问层。

性能:

OSIV倾向于在地毯下拖拉适当的实体负载-你往往不会注意到你的集合或实体是延迟初始化的(也许是N + 1)。更多便利,更少控制。

更新:有关此主题的更多讨论,请参见OpenSessionInView反模式。作者列出了三个要点:

  1. 每个惰性初始化都会给你一个查询,这意味着每个实体将需要N + 1个查询,其中N是惰性关联的数量。如果你的屏幕上显示表格数据,则阅读Hibernate日志是一个很大的提示,表明你不应该这样做
  2. 这完全破坏了分层体系结构,因为你在演示层中不满意DB。这是一个概念上的弊端,所以我可以接受,但是有一个必然结果
  3. 最后但并非最不重要的一点是,如果在获取会话时发生异常,则该异常将在页面的编写过程中发生:你无法向用户显示干净的错误页面,唯一可以做的就是在正文中写入错误消息


 类似资料:
  • 问题内容: 有一个很大的材料了有这表明印刷异常的堆栈跟踪是不好的做法。 例如从Checkexp中的RegexpSingleline检查: 可以使用此检查来查找常见的不良做法,例如调用ex.printStacktrace() 但是,我正在努力寻找能够给出正当理由的任何地方,因为肯定可以使堆栈跟踪对于跟踪导致异常的原因非常有用。我知道的事情: 最终用户永远不应看到堆栈跟踪(出于用户体验和安全目的) 生

  • 问题内容: 我一直看到警告,不要在JavaScript中使用全局变量,但是似乎人们说这的唯一原因是因为阻塞了全局名称空间。我可以想象通过将所有变量放入一个大对象中来轻松解决此问题。现在的问题是:除了方便起见,还有其他原因不使用全局变量吗?它们是否涉及任何性能或兼容性问题? 问题答案: 它们使全局名称空间混乱,并且查找速度比局部变量慢。 首先,拥有许多全局变量始终是一件坏事,因为很容易忘记您在某个地

  • 问题内容: 我目前遇到一个问题,我有两个我需要调用的模块,它们需要能够修改相同的变量。 我决定创建一个名为的全局变量,并在其中存储所需的变量。 但是我一直在阅读,使用全局变量是一种不好的做法。为什么? 我仅创建一个变量,该变量不应与其他任何冲突,因为它是我的应用程序的名称。 问题答案: 几乎在所有编程语言中,全局变量都被视为反模式,因为它们使遵循和调试代码变得非常困难。 浏览代码时,您永远不知道哪

  • 问题内容: 看到这个答案。它说: 六个非常糟糕的例子; … 锁定在可变字段上。例如,synced(object){object = …; } 锁定可变字段有什么问题?如果被声明为但不是不可变的类怎么办? 问题答案: 这是一个坏主意,因为如果另一个线程更改了关键部分中的引用,则这些线程将不再看到相同的引用,因此它们将不会在同一对象上同步,从而不受控制地运行。例: 假设有2个线程试图进入此关键部分。线

  • 问题内容: 我大致认为使用iframe是“不好的做法”。 这是真的?使用它们的优点/缺点是什么? 问题答案: 与所有技术一样,它也有起有落。如果您要使用iframe到一个经过适当开发的网站周围走走,那当然是个坏习惯。但是,有时iframe是可以接受的。 iframe的主要问题之一与书签和导航有关。如果您使用它只是将页面嵌入内容中,我认为很好。这就是iframe的用途。 但是我也看到iframe也被

  • 问题内容: function foo () { global $var; // rest of code } 在我的小型PHP项目中,我通常采用过程方式。通常,我有一个包含系统配置的变量,当我需要在函数中访问此变量时,我会这样做。 这是不好的做法吗? 问题答案: 当人们谈论其他语言的全局变量时,这意味着与PHP中的操作有所不同。那是因为变量在PHP 中并不是 真正的 全局变量。典型的PHP程序的范