Spring Boot 中的 spring.jpa.open-in-view=true 属性是什么?

2024-05-04

I saw spring.jpa.open-in-view=trueSpring Boot 文档中用于 JPA 配置的属性。

  • Is the true如果根本没有提供此属性的默认值?
  • 这到底有什么作用?我没有找到任何好的解释;
  • 它让你使用SessionFactory代替EntityManagerFactory?如果是,我该如何告诉它允许我使用EntityManagerFactory反而?

Thanks!


OSIV 反模式

OSIV(在视图中打开会话)不是让业务层决定如何最好地获取视图层所需的所有关联,而是强制持久性上下文保持打开状态,以便视图层可以触发代理初始化,如图所示通过下图。

  • The OpenSessionInViewFilter称为openSession底层方法SessionFactory并获得一个新的Session.
  • The Session绑定到TransactionSynchronizationManager http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/transaction/support/TransactionSynchronizationManager.html.
  • The OpenSessionInViewFilter称为doFilter of the javax.servlet.FilterChain对象引用并进一步处理请求
  • The DispatcherServlet http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/DispatcherServlet.html被调用,它将 HTTP 请求路由到底层PostController.
  • The PostController称为PostService得到一个列表Post实体。
  • The PostService打开一个新交易,并且HibernateTransactionManager重复使用相同的Session这是由OpenSessionInViewFilter.
  • The PostDAO获取列表Post实体而不初始化任何惰性关联。
  • The PostService提交基础事务,但是Session没有关闭,因为它是从外部打开的。
  • The DispatcherServlet开始渲染 UI,而 UI 又会导航惰性关联并触发它们的初始化。
  • The OpenSessionInViewFilter可以关闭Session,并且底层数据库连接也被释放。

乍一看,这可能看起来并不是一件可怕的事情,但是,一旦您从数据库的角度来看它,一系列缺陷就会开始变得更加明显。

服务层打开和关闭数据库事务,但之后没有显式事务发生。因此,从 UI 渲染阶段发出的每个附加语句都以自动提交模式执行。自动提交会给数据库服务器带来压力,因为每个事务在结束时都会发出提交,这可能会触发事务日志刷新到磁盘。一种优化是标记Connection作为只读,这将允许数据库服务器避免写入事务日志。

不再存在关注点分离,因为语句是由服务层和 UI 渲染过程生成的。编写断言生成的语句数量的集成测试需要遍历所有层(Web、服务、DAO),同时将应用程序部署在 Web 容器上。即使使用内存数据库(例如 HSQLDB)和轻量级 Web 服务器(例如 Jetty),这些集成测试的执行速度也会比层分离并且后端集成测试使用数据库而前端集成测试要慢。最终集成测试完全模拟了服务层。

UI 层仅限于导航关联,这反过来又会触发 N+1 查询问题。尽管 Hibernate 提供@BatchSize https://docs.jboss.org/hibernate/orm/current/javadocs/org/hibernate/annotations/BatchSize.html用于批量获取关联,以及FetchMode.SUBSELECT https://docs.jboss.org/hibernate/orm/current/javadocs/org/hibernate/annotations/FetchMode.html#SUBSELECT为了应对这种情况,注释会影响默认的获取计划,因此它们会应用于每个业务用例。因此,数据访问层查询更合适,因为它可以根据当前用例的数据获取要求进行定制。

最后但并非最不重要的一点是,数据库连接在整个 UI 呈现阶段保持不变,这会增加连接租用时间,并由于数据库连接池拥塞而限制总体事务吞吐量。持有的连接越多,等待从池中获取连接的其他并发请求就越多。

Spring Boot 和 OSIV

很遗憾,Spring Boot 中默认启用 OSIV(在视图中打开会话) https://github.com/spring-projects/spring-boot/issues/7107,从性能和可扩展性的角度来看,OSIV 确实是一个坏主意。

因此,请确保在application.properties配置文件中,您有以下条目:

spring.jpa.open-in-view=false

这将禁用 OSIV,以便您可以处理LazyInitializationException正确的方式。

从2.0版本开始,Spring Boot出现问题OSIV 时发出警告 https://github.com/spring-projects/spring-boot/issues/7107默认情况下启用,因此您可以在问题影响生产系统之前就发现它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot 中的 spring.jpa.open-in-view=true 属性是什么? 的相关文章

随机推荐

  • Windows 上任何单个进程可以寻址的最大内存量

    Windows 版本的内存限制 http msdn microsoft com en us library windows desktop aa366778 28v vs 85 29 aspx回答 Windows 上任何单个进程可以寻址的最
  • 在 TypeScript 中使用三个 Js + OrbitControl

    我无法得到this http www example com 在 TypeScript 中使用上述组合的示例 I have and 在我的html中和打字稿文件
  • 在 Light Table 中使用 Datomic 时出现“无读取器功能”错误

    当我在 lighttable 中评估这段代码时 ns app core require datomic api refer q as d reload all defn add person conn id d transact conn
  • MATLAB 是否已有 YAML 库/解析器?

    我想使用 YAML 跨多种语言交流一些数据 将其视为 与语言无关的序列化 其中一种语言是 MATLAB 但我似乎找不到该语言的 YAML 库 我在 Google 上检查了 matlab yaml 和 matlab yaml parse 似乎
  • 获取文件的上次访问时间

    我知道使用File对象我们可以获得最后修改时间File i e 文件 lastModified https docs oracle com javase 8 docs api java io File html lastModified 但
  • pyspark中的稀疏向量RDD

    我一直在使用 mllib 的功能通过 Python Pyspark 实现此处描述的 TF IDF 方法 https spark apache org docs 1 3 0 mllib feature extraction html http
  • 知识树中的段错误

    我正在用 c 实现一个可以从文件中读取的知识树 我的 newStr 函数出现段错误 我无法用这个问题测试我的其余代码 我对 c 没有太多经验 任何帮助将不胜感激 我的 c 文件 包括 包括 include 动物 h 包括 包括 return
  • 如何提取 MySQL 日期中的月份和年份并进行比较?

    如何从 mySQL 日期中提取月份和日期并将其与另一个日期进行比较 我找到了 this MONTH 但它只获取月份 我寻找月份和年份 在Mysql Doku中 http dev mysql com doc refman 5 5 en dat
  • MySQL SUM 具有相同的 ID

    抱歉 这个真正简单的问题 我刚刚学习 PHP 和 MySQL 我已经在谷歌上搜索了一个多星期 但没有找到任何答案 我创建了一个简单的财务脚本 表格如下 table a aid value 1 100 2 50 3 150 table b b
  • @NotNull 注释未检查 Jersey REST 资源中的空查询参数

    我正在尝试使用 javax validation validation api 进行验证 QueryParam参数 我已按照以下步骤操作 添加依赖项
  • 如何使用C#检测IIS版本?

    如何使用C 检测IIS版本 更新 我的意思是来自 winapp 实际上该场景是开发一个自定义安装程序 想要检查已安装 IIS 的版本以调用适当的 api 在这里找到了答案 链接文本 http forums iis net p 1162404
  • Android maven插件生成多个dex文件

    如何使用 android maven 插件生成多个 dex 文件而不是一个以避免 android 64k 方法问题 可以使用这个插件来做到这一点 还是我必须使用 gradle 来做到这一点 解决方案 通过这个拉取请求https github
  • 如何使用递归获取父级的所有子级,然后获取其子级

    问候 我的 JSP Web 应用程序中有父事务的比喻 我将事务 ID 存储在数据库中 要求是显示父级的所有子级 然后显示父级子级的后续子级 实际上 这个父母及其孩子的列表永远不会超过 4 或 5 层 但我需要考虑到它可以比这更多层 我尝试过
  • 解码URIComponent抛出错误“URI格式错误”

    As unescape已被弃用 我已选择decodeURIComponent 但它没有按预期工作 decodeURIComponent无法解码以下 URI 组件 Coast 20Guard 20Academy 20to 20hold 20a
  • 了解左值到右值转换的示例

    我很难理解这段代码 来自 C 14 草案标准的示例 转换拉瓦尔 调用未定义的行为g false 为什么constexpr使程序有效 另外 不访问 是什么意思 y n 在两次通话中g 我们正在返回n数据成员那么为什么最后一行说它不能访问它呢
  • 在Rails环境中执行Ruby Worker脚本

    我有以下案例 我希望能够将独立的 Ruby 脚本作为守护进程运行 我希望能够在我的 Rails 项目的上下文 环境中执行此脚本 例如 以便该脚本可以访问后端 我的 Rails 模型 有没有一种简单的方法可以实现这一点 Thanks Use
  • 如何防止 Ajax/javascript 结果在浏览器中缓存?

    如何防止浏览器缓存Ajax结果 我有事件触发的 Ajax 脚本 仅当浏览器数据被清除时才显示结果 在 IE6 和 Firefox 3 0 10 中测试 随机 URL 可以工作 但它是一种 hack HTTP 内置了应该可以工作的解决方案 尝
  • 如何调试 Jenkins 作业中无法运行程序“C:\Program Files\Git”?

    我正在使用 jenkins 构建我的 git 项目 这是我在查看日志时收到的错误 我在 jenkins 中使用 git 插件 您将如何解决该错误消息 Started by user anonymous Building in workspa
  • 使用 JWT 验证单独的 API 微服务

    我正在 NodeJS 中使用微服务开发一个应用程序 我已经构建了一个 auth api 它处理通常的注册登录等 并且它发出 JWT 如何使用它们来保护用 Express 编写的单独 API 微服务中的路由 我是否需要使用 JWT 和密钥来解
  • Spring Boot 中的 spring.jpa.open-in-view=true 属性是什么?

    I saw spring jpa open in view trueSpring Boot 文档中用于 JPA 配置的属性 Is the true如果根本没有提供此属性的默认值 这到底有什么作用 我没有找到任何好的解释 它让你使用Sessi