【问题标题】:What is a database session?什么是数据库会话?
【发布时间】:2026-01-05 18:05:01
【问题描述】:
我对数据库事务的概念有一个大致的了解。我们在事务中访问数据库以确保 ACID 属性。
在 Hibernate 中有一个称为会话的概念。会话有什么用?何时应该在两个会话中而不是在同一个会话中访问数据库?
为了解释更多,我看到了休眠代码
- 从会话工厂获取会话
- 打开一个会话
- 开始交易
- 提交事务
- 关闭会话
我需要知道的是,这里的会话的重要性是什么?为什么不用事务工厂之类的东西,开始事务并提交事务?
【问题讨论】:
标签:
java
hibernate
session
transactions
【解决方案1】:
会话不仅仅是一个事务,它是UnitOfWork 模式的一个实现。换句话说,它保留加载的对象,知道哪些对象必须被持久化等:
工作单元会跟踪您在业务交易期间所做的所有可能影响数据库的事情。完成后,它会计算出根据您的工作更改数据库需要做的所有事情。
为了更好地理解 Session 和 Transaction 之间的关系,您可以查看this article。
单个 Hibernate Session 可能与单个数据库事务具有相同的范围。
这是用于每请求会话实现模式的最常见的编程模型。单个 Session 和单个数据库事务实现对特定请求事件的处理(例如,Web 应用程序中的 Http 请求)。永远不要使用 session-per-operation 反模式! (当每个操作会话可能是合适的时候,有极少数的例外,如果你只是学习 Hibernate,你不会遇到这些。)
另一种编程模型是长对话,例如实现多步骤对话框的应用程序,例如向导对话框,以在多个请求/响应周期中与用户交互。
实现这一点的一种方法是 session-per-request-with-detached-objects 模式。一旦持久对象在用户思考期间被认为是分离的,并且必须在它们被修改后重新附加到新的会话。
但建议使用会话每次会话模式。在这种情况下,单个 Session 比单个数据库事务具有更大的范围,它可能跨越多个数据库事务。每个请求事件都在单个数据库事务中处理,但 Session 的刷新将延迟到会话结束和最后一个数据库事务,以使会话具有原子性。在用户思考期间,会话保持断开状态,没有打开的数据库连接。 Hibernate 的自动乐观并发控制(带版本控制)用于提供对话隔离。
【解决方案2】:
@Dmitry 的回答非常好。
查看会话的另一种方式是数据库使用实例。当你创建一个会话时,你有一个上下文准备好与其中所需的支持服务(例如事务、缓存、连接等)进行任何数据库交互。事务是会话中使用的独立服务。
此外,会话是典型的 OR 映射工具(如 hibernate)使用的第一级缓存。会话充当根据请求创建的临时上下文以促进数据库交互。