什么是数据库会话?

Can*_*ell 21 java session hibernate transactions

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

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

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

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

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

Dmi*_*try 20

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

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

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

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

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

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

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


San*_*osh 6

@Dmitry回答得非常好.

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

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