什么是数据库会话?

时间:2012-05-09 18:27:11

标签: java hibernate session transactions

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

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

为了解释更多,我看到了

的hi​​bernate代码
  • 从会话工厂获取会话
  • 打开会话
  • 开始交易
  • 提交交易
  • 关闭会话

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

2 个答案:

答案 0 :(得分:20)

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

  

工作单元会跟踪您在业务事务中可能影响数据库的所有操作。完成后,它会计算出因工作原因需要更改数据库的所有内容。

为了更好地理解会话和交易之间的关系,您可以查看this article

  

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

     

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

     

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

     

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

答案 1 :(得分:6)

@Dmitry回答得非常好。

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

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