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

视图中的Hibernate Open Session:每个请求的交易量?

缪修德
2023-03-14
问题内容

我在Tomcat上使用Spring的Hibernate。我一直在阅读和重新阅读该主题上指向JBoss
Wiki页面
的信息,这很有帮助。但这使我有些疑问。

  1. 为每个请求启动事务的想法困扰着我。我想我可以将过滤器限制为某些控制器-也许将需要事务的所有控制器放在伪“ tx”路径下。但是,如果您不知道是否需要交易,使用交易不是一个坏主意吗?而且,如果我只是在某些请求中进行读取(读取很有可能来自缓存),那么没有交易我会更好吗?

  2. 我读过一些帖子,提到它们如何在服务层处理事务,我想在Spring中做到这一点。但是,过滤器代码是什么样的?我仍然希望该会话在我的视图中可用以进行一些延迟加载。

  3. 如果我要做的就是sessionFactory.getCurrentSession()在过滤器中调用,它如何“释放”回会话工厂以供重用?(session.close()即使使用事务,我也希望看到一个或一个东西。)谁在告诉会话工厂该会话可以重用?

  4. 也许beginTransaction()是在请求期间将给定数据库连接绑定到给定会话的调用?否则,会话会根据需要从池中拉数据库连接,对吗?

感谢您耐心等待我所有的问题。

(如果您的答案将链接到Spring文档,您只会让我哭泣。您不想要那样吗,如果人们停止回答与Spring相关的问题,我将付钱给我。道路。)


问题答案:

您的担忧是正确的,Wiki页面上提供的解决方案过于简单。交易不应在Web层进行管理-交易应在服务层进行。

正确的实现将打开一个会话并将其绑定到过滤器中的线程。没有事务开始。会话进入刷新模式永不-
只读模式。服务调用会将会话设置为自动刷新模式并启动/提交事务。服务方法完成后,会话刷新模式将恢复为从不。

还有一个选项可以不打开过滤器中的会话。每个服务层调用都会打开一个单独的会话和事务-
在完成服务调用后,会话不会关闭,但会注册为延迟关闭。Web请求处理完成后,会话将关闭。

Spring提供了如上所述的OpensessionInViewFilter。因此,请忽略jboss
Wiki文章,仅配置OpensessionInViewFilter-一切都会好起来。

SessionFactory.getCurrentSession()-在内部创建会话并将其分配给本地线程。每个请求/线程都会有自己的会话。Web请求处理完成后,会话将关闭。从代码中,您只需要使用SessionFactory.getCurrentSession()即可,而不必关闭它。jboss
Wiki页面上的代码示例是错误的-
在finally块中应该有一个SessionFactory.getCurrentSession()。close()。或者他们可能正在使用JTA事务,并且将hibernate配置为与JTA事务一起打开/关闭会话。



 类似资料:
  • RequestToViewNameTranslator接口可以在逻辑视图名未被显式提供的情况下,决定一个可用的逻辑视图View名。 DefaultRequestToViewNameTranslator能够将请求URL映射到逻辑视图名上去,如下面代码例子所示: public class RegistrationController implements Controller { publi

  • 在上面的代码示例中,试图为每个请求生成唯一的txn-id。但是,观察到它正在重复使用相同的数字导致重复。我还尝试使用以下方法根据当前时间生成,当在1秒内触发超过1个请求时,它仍然会导致重复。 任何替代解决方案来为每个请求生成唯一ID,而不管并发情况如何? 提前感谢。

  • 问题内容: 按照“不干扰JavaScript”的建议,我想将我的JavaScript逻辑分成 单独的文件。但是我不知道如何组织它们。 我是不是该: 只需将所有应用程序javascript扔到Application.js文件中,然后将其与布局页面一起加载?这是简单的方法,但最终会导致膨胀的Application.js。某些用户可能只想访问几个页面,但是会预加载整个文件,这不好。 还是应该为每个视图创

  • 问题内容: 我有登录功能 此函数用于将变量保存到会话中, 但是当新请求检查用户是否登录时 然后返回总是“注销”,因为会话已更改。我使用Redis来存储会话,我认为这是Redis的错误,因为当我停止使用Redis时,可以,请帮帮我! 问题答案: 最好的处理方式是始终让Express处理它(如果可以的话)。 https://flaviocopes.com/express-sessions/(更新了会话

  • 我一直有一个问题,当请求来自域名而不是localhost时,会话变量不可用。例如,如果我设置一个用户变量: 当客户端发出另一个请求并且我尝试访问用户会话变量时,它返回null。 我注意到,在每个请求中,都会设置一个新的JSESSIONID cookie,并且ID值会更改。这是否意味着每次客户端访问服务器时都会创建一个新会话?如何在客户端之间保持相同的会话,以便我可以在Http会话中存储对象并访问它

  • 我正在Postman中编写测试,我有多个请求分组如下: > 某些测试标题: > 创建用户(一组“预请求”): 发送一些创建用户所需的请求,这些请求是运行测试所必需的 对已创建用户的一些操作(这里我正在测试测试标题中的内容) 一个或多个请求 < li >创建用户(一组“预先请求”,与测试1中相同。): < ul > < li >发送创建用户、运行测试所需的一些请求 一个或多个请求 总的来说,当我想测