什么是数据库会话?

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

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

为了解释更多,我已经看到了hibernate代码

  • 从会话工厂获取会话
  • 打开一个会话
  • 开始交易
  • 提交交易
  • 结束会议

我需要知道的是会话在这里的重要性是什么? 为什么不像事务工厂那样,开始事务和提交事务?

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

工作单元会跟踪您在业务事务期间可能影响数据库的所有操作。 完成后,它会计算出由于您的工作而需要更改数据库的所有操作。

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

单个Hibernate会话可能与单个数据库事务具有相同的范围。

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

另一种编程模型是长对话,例如实现多步对话的应用程序,例如向导对话,以在若干请求/响应循环中与用户交互。 实现此目的的一种方法是每个请求的会话分离对象模式。 一旦持久对象在用户思考时被认为是分离的,并且在修改后必须重新连接到新的Session。

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

@Dmitry回答得非常好。

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

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