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

Car*_*rto 88 java spring jpa spring-data spring-boot

我在Spring Boot文档中看到了JPA配置的这个属性spring.jpa.open-in-view=true.那么它被设置为true,它是默认值吗?

它到底意味着什么?我没有找到任何解释这种行为.

它应该是使用Hibernate SessionFactory来代替EntityManagerFactory?如果是,我该如何设置EntityManagerFactory

感谢任何帮助.

谢谢!

Vla*_*cea 224

不幸的是,在Spring Boot中默认启用了OSIV(Open Session in View),从性能和可伸缩性的角度来看,OSIV确实是个坏主意.

因此,请确保在OpenSessionInViewFilter配置文件中包含以下条目:

spring.jpa.open-in-view=false
Run Code Online (Sandbox Code Playgroud)

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

从版本2.0开始,Spring Boot会默认情况下启用OSIV时发出警告,因此您可以在影响生产系统之前很久就发现此问题.

  • 根据维基百科的说法,“反模式是对重复出现的问题的常见反应,通常是无效的,并且有可能适得其反”。这正是“在视图中打开会话”的含义。 (9认同)
  • 现在有一个警告被记录. (8认同)
  • 1)当然,你错了。每个 Tx 都会发出一个提交,该提交将由数据库处理。因此,这是一个额外的开销,因为在 2PL 中,必须释放读锁,而在 MVCC 中,SI 快照可以被丢弃。这是 DB 101。2) 又错了。JDBC 与此无关。这是关于哪一层控制事务边界。3)又错了。N+1 可以通过 OSIV 或 FetchType.EAGER 发生,而不仅仅是惰性集合。4)又错了。[通用可扩展性定律](http://www.perfdynamics.com/Manifesto/USLscalability.html) 从数学上证明了这一点。你也应该读一下;) (6认同)
  • 它仅适用于 Spring Boot。在标准 Spring 中,您可以显式选择要使用的 Bean 或是否需要 Web 过滤器,例如 OSIV。我不知道你是否可以通过一些注释来禁用它。我只知道配置设置。 (3认同)
  • 这不是一种反模式。它确实会对性能产生影响,有时是负面的,很多时候是相当中性的,并且在很多情况下都是积极的:如果您实际上想要一个惰性关系,那么您不需要在所有情况下都进行查询并且可以在需要时通过使用 open-in-view 来避免它。 (2认同)
  • 以防万一您决定添加“spring.jpa.open-in-view = false”,请确保正确重新启动您的 spring-boot-应用程序,而不是仅仅让它自动重新加载。如果您执行后者,您将收到已存在的开放视图“@ConditionalOnProperty”的通知。请参阅 https://www.yawintutor.com/conditionalonproperty-found- Different-open-in-view/。手动重新启动服务器对我的情况有帮助。 (2认同)
  • 完全不相信。就我个人而言,我不太喜欢 OSIV,但这里给出的理由是错误的。1)“自动提交给数据库服务器带来了压力,因为每个语句都必须将事务日志刷新到磁盘,因此导致数据库端产生大量 I/O 流量。”,不,RDBMS 并不那么愚蠢 - 这种说法没有任何证据就给出了,根据经验我知道这不会发生。2)“不再存在关注点分离”,无意义,因为这些 JDBC 语句是透明且隐式生成的;... (2认同)

dun*_*nni 36

此属性将注册一个OpenEntityManagerInViewInterceptor,它将一个注册EntityManager到当前线程,因此EntityManager在Web请求完成之前您将具有相同的权限.它与Hibernate SessionFactory等无关.

  • 拦截器仅在您使用 Spring 中的 DispatcherServlet 时起作用(因为拦截器是 Spring 机制)。过滤器可以映射到所有已配置的 servlet(我们将它用于我们的一个应用程序中的 FacesServlet)。所以如果你只使用DispatcherServlet,你可以添加属性并移除过滤器,否则使用过滤器。 (2认同)

Rog*_*nco 23

可能已经晚了,但我试图更多地了解将其关闭与打开的含义,我发现这篇文章很有用spring-open-session-in-view

希望这可以帮助别人......