什么是数据库会话?
我理解对数据库事务概念的一般理解。 我们访问事务中的数据库以确保ACID属性。
在Hibernate中有一个称为会话的概念。 会话的用途是什么? 数据库访问何时应该在两个会话中而不是在同一个会话中发生?
为了解释更多,我已经看到了hibernate代码
- 从会话工厂获取会话
- 打开一个会话
- 开始交易
- 提交交易
- 结束会议
我需要知道的是会话在这里的重要性是什么? 为什么不像事务工厂那样,开始事务和提交事务?
Session不仅仅是一个事务,它是UnitOfWork模式的一个实现。 换句话说,它保留了加载的对象,知道哪些对象必须被持久化等等:
工作单元会跟踪您在业务事务期间可能影响数据库的所有操作。 完成后,它会计算出由于您的工作而需要更改数据库的所有操作。
为了更好地理解Session和Transaction之间的关系,您可以查看本文 。
单个Hibernate会话可能与单个数据库事务具有相同的范围。
这是用于每个请求的会话实现模式的最常见的编程模型。 单个会话和单个数据库事务实现特定请求事件的处理(例如,Web应用程序中的Http请求)。 永远不要使用会话操作反模式! (当每次操作会话可能合适时,极少数例外,如果您只是学习Hibernate,则不会遇到这些。)
另一种编程模型是长对话,例如实现多步对话的应用程序,例如向导对话,以在若干请求/响应循环中与用户交互。 实现此目的的一种方法是每个请求的会话分离对象模式。 一旦持久对象在用户思考时被认为是分离的,并且在修改后必须重新连接到新的Session。
然而,建议使用每会话会话模式。 在这种情况下,单个会话的范围大于单个数据库事务,并且它可能跨越多个数据库事务。 每个请求事件都在一个数据库事务中处理,但会话的刷新将延迟到会话结束和最后一个数据库事务,以使会话成为primefaces。 在用户思考期间,会话处于断开状态,没有打开的数据库连接。 Hibernate的自动乐观并发控制(带版本控制)用于提供对话隔离。
@Dmitry回答得非常好。
查看会话的另一种方法是作为数据库使用实例 。 创建会话时,您可以准备好上下文,以便与其中所需的支持服务(例如,事务,缓存,连接等)进行任何数据库交互。 事务是会话中使用的独立服务。
此外,会话是典型OR映射工具(如hibernate)使用的第一级缓存。 会话充当临时上下文,根据请求创建以促进数据库交互。
- 如何使用JPA连接到多个数据库?
- Java应用服务器性能
- Hibernate可以返回除List之外的结果对象的集合吗?
- java.lang.ClassCastException:java.lang.Class无法强制转换为java.lang.reflect.ParameterizedType
- 在持久化Hibernate之前自动设置bean值(列)?
- Lombok @builder在一个扩展另一个类的类上
- 如何在hibernate注释类中将两列作为主键
- 什么时候在hibernate中使用Lazy loading / Eager加载?
- 为什么Hibernate 4.2使用jandex和classmate,如果它的Maven POM将它们定义为测试范围?