什么是数据库会话?

28

我理解数据库事务的概念,我们可以在事务中访问数据库以确保 ACID 属性。

Hibernate 中有一个称为“session”的概念。会话的用途是什么?何时应该在两个会话而不是同一会话中进行数据库访问?

更具体地说,我看过 Hibernate 代码,其中:

  • 从会话工厂获取会话
  • 打开会话
  • 开始事务
  • 提交事务
  • 关闭会话

我需要知道的是这里会话的重要性是什么?为什么不使用类似于事务工厂、开始事务和提交事务的东西呢?


2
在什么情况下应该在两个会话中进行数据库访问,而不是在同一会话中进行访问? - Sully
1
请注意 - 有一个维基百科页面:http://en.wikipedia.org/wiki/Session_(computer_science) - Sridhar Sarnobat
2个回答

27

Session不仅仅是一次事务,它还是UnitOfWork模式的实现。换句话说,它把加载的对象保存下来,知道哪些对象需要持久化等:

工作单元(Unit of Work)追踪业务交互期间对数据库所有影响,当你完成时,它会计算出由于你的工作需要执行哪些操作来更改数据库。

为了更好地理解Session和Transaction之间的关系,您可以查看this article

一个Hibernate Session的作用域可能与一个数据库事务相同。这是session-per-request实现模式中最常见的编程模型。单个Session和单个数据库事务实现特定请求事件(例如Web应用程序中的HTTP请求)的处理。千万不要使用session-per-operation反模式!(极其罕见的例外情况除外,如果您只是学习Hibernate,则不会遇到这些情况。)
另一种编程模型是长时间对话,例如实现多步对话框(例如向导对话框)的应用程序,以在几个请求/响应周期中与用户交互。其中一种实现方式是session-per-request-with-detached-objects模式。一旦持久对象在用户思考期间被认为是分离的,并且在修改后必须重新附加到新会话中。
然而,推荐使用session-per-conversation模式。在这种情况下,单个Session的作用域大于单个数据库事务,并且它可能跨越多个数据库事务。每个请求事件在单个数据库事务中处理,但是Session的刷新将延迟到对话结束和最后一个数据库事务之前,以使对话具有原子性。Session在用户思考时间期间保持断开状态,没有打开的数据库连接。使用Hibernate的自动乐观并发控制(带版本控制)来提供对话隔离。

11

@Dmitry非常好地回答了问题。

从另一个角度来看,会话可以视为数据库使用的实例。创建会话后,您可以使用所需支持服务(例如事务、缓存、连接等)进行任何数据库交互。事务是在会话内使用的独立服务。

此外,会话也是典型的OR映射工具(如Hibernate)使用的第一级缓存。会话作为临时上下文在请求时创建,以促进与数据库的交互。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接