什么是数据库会话?

2022-09-01 15:55:53

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

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

为了解释更多,我看到了休眠代码

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

我需要知道的是,在这里举行一次会议的重要性是什么?为什么不拥有像事务工厂这样的东西,开始事务并提交事务呢?


答案 1

会话不仅仅是一个事务,它是UnitOfWork模式的实现。换句话说,它保留加载的对象,知道哪些对象必须持久化等:

工作单元跟踪您在业务事务期间执行的可能影响数据库的所有操作。当你完成时,它会找出由于你的工作而改变数据库需要做的所有事情。

为了更好地理解会话和事务之间的关系,您可以查看本文

单个休眠会话可能与单个数据库事务具有相同的作用域。

这是用于每个请求会话实现模式的最常见编程模型。单个会话和单个数据库事务实现特定请求事件(例如,Web 应用程序中的 Http 请求)的处理。切勿使用每次操作会话的反模式!(当每个操作的会话可能合适时,存在极少数例外情况,如果您只是在学习Hibernate,则不会遇到这些例外情况。

另一种编程模型是长对话,例如,实现多步骤对话的应用程序,例如向导对话框,以在多个请求/响应周期中与用户进行交互。实现这一点的一种方法是会话-每个请求-分离-对象模式。一旦持久性对象在用户思考期间被视为已分离,并且必须在修改后重新附加到新会话。

但是,建议使用每会话模式。在这种情况下,单个会话的作用域比单个数据库事务更大,并且它可能跨越多个数据库事务。每个请求事件都在单个数据库事务中处理,但会话的刷新将延迟到会话结束和最后一个数据库事务,以使会话成为原子。会话在用户思考期间处于断开连接状态,没有打开的数据库连接。Hibernate 的自动乐观并发控制(带版本控制)用于提供会话隔离。


答案 2

@Dmitry回答得非常好。

查看会话的另一种方法是作为数据库使用情况的实例。创建会话时,您已经准备好了一个上下文,用于其中所需的任何数据库与支持服务(例如事务,缓存,连接等)的交互。事务是在会话中使用的独立服务。

此外,会话是典型的OR映射工具(如休眠)使用的第一级缓存。会话充当根据请求创建的临时上下文,以促进数据库交互。


推荐