【问题标题】:What is the difference between a Session and a Connection in Hibernate?Hibernate 中的会话和连接有什么区别?
【发布时间】:2015-02-12 20:11:00
【问题描述】:

我要清除基本的3点,

在旧会话上开始新的数据库事务是否会获得一个 新连接并恢复会话?

提交数据库事务是否会断开会话与 JDBC连接并返回连接池?

来自 Hibernate 文档,需要早期版本的 Hibernate 会话的显式断开和重新连接。这些方法 已弃用,因为开始和结束事务具有相同的 影响。它们如何产生相同的效果?

【问题讨论】:

    标签: hibernate session jpa database-connection connection-pooling


    【解决方案1】:

    Hibernate Session 只是一个事务性后写缓存,可将实体状态转换转换为 DML 语句。 Hibernate Session 可以与数据库连接或断开连接。当它断开连接时,它无法将当前待处理的实体状态更改刷新到底层数据库。

    associate a Hibernate Session to a database transaction有多种方式:

    • session-per-request(会话绑定到单个逻辑@Transaction 和一个物理数据库事务的生命周期)
    • 长对话(会话可以跨越多个@Transaction 操作,因此涉及多个数据库事务)

    对于数据库事务,有两种不同的方法:

    • RESOURCE_LOCAL 事务,使用单个 DataSource 将始终将物理数据库事务绑定到 Hibernate Session(在单个逻辑事务的上下文中,这意味着您仍然可以实现长对话以跨越多个此类逻辑事务)。

    • JTA,使用多个数据源。 JTA 声明应该在每条语句之后积极释放连接,但实际上,在单个逻辑事务的上下文中您仍然会获得相同的 JDBC 连接句柄。

    现在回到你的问题:

    1. 在旧会话上开始新的数据库事务是否会获得新连接并恢复会话?

    是的。 Hibernate 会话已重新连接,并且可以继续刷新/提交。

    1. 提交数据库事务是否会断开会话与 JDBC 连接的连接并将连接返回到池?

    默认情况下,当你提交一个事务时,Session 关闭,底层连接也关闭。如果使用连接池,数据库连接确实会回到池中。

    1. 根据 Hibernate 文档,Hibernate 的早期版本需要显式断开和重新连接会话。这些 方法已被弃用,因为事务的开始和结束具有 同样的效果。它们如何产生相同的效果?

    这些方法已被弃用,因为 connection management 现在由 connection release modes 控制。

    【讨论】:

    • 对于我的第二个问题,您提到,“默认情况下,当您提交事务时,会话关闭..”。那么,为什么在我提交 session.close() 之后需要它,即 session.getTransaction.commit()。我是否正确地说关闭会话和断开会话确实是两件不同的事情?
    • 您可以有一个会话和多个事务。这发生在扩展的持久性上下文场景中。结束对话时,您有多个只读事务和一个写事务。
    • 那么“默认情况下,当您提交事务时,会话关闭”是什么意思?这是一个带有声明性@Transaction 的每个请求会话的情况吗?
    • 是的,对于标准的每请求会话。
    猜你喜欢
    • 1970-01-01
    • 2011-09-14
    • 2011-05-27
    • 2011-07-04
    • 2018-08-05
    • 2011-08-06
    • 2021-09-11
    • 2011-08-17
    相关资源
    最近更新 更多