Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate中的会话和连接有什么区别?_Hibernate_Session_Jpa_Database Connection_Connection Pooling - Fatal编程技术网

Hibernate中的会话和连接有什么区别?

Hibernate中的会话和连接有什么区别?,hibernate,session,jpa,database-connection,connection-pooling,Hibernate,Session,Jpa,Database Connection,Connection Pooling,我想澄清基本的三点 在旧会话上启动新数据库事务是否会获得 是否新建连接并恢复会话 提交数据库事务是否会断开会话与数据库的连接 JDBC连接并返回到池的连接 根据Hibernate文档,需要Hibernate的早期版本 会话的显式断开和重新连接。这些方法 不推荐使用,因为事务的开始和结束具有相同的 效果。它们如何具有相同的效果 Hibernate会话只是一个事务性写后缓存,它将实体状态转换转换为DML语句。Hibernate会话可以与数据库连接或断开连接。断开连接后,它无法将当前挂起的实体状态更改

我想澄清基本的三点

在旧会话上启动新数据库事务是否会获得 是否新建连接并恢复会话

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

根据Hibernate文档,需要Hibernate的早期版本 会话的显式断开和重新连接。这些方法 不推荐使用,因为事务的开始和结束具有相同的 效果。它们如何具有相同的效果


Hibernate会话只是一个事务性写后缓存,它将实体状态转换转换为DML语句。Hibernate会话可以与数据库连接或断开连接。断开连接后,它无法将当前挂起的实体状态更改刷新到基础数据库

有多种方法可以:

  • 每个请求的会话(会话绑定到单个逻辑@事务和一个物理数据库事务的生命周期)
  • 长对话(会话可以跨越多个@Transaction操作,因此涉及多个数据库事务)
对于数据库事务,有两种不同的方法:

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

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

现在回到你的问题:

  • 在旧会话上启动新数据库事务是否会获得新连接并恢复会话
  • 对。Hibernate会话已重新连接,可以继续刷新/提交

  • 提交数据库事务是否会断开会话与JDBC连接的连接并将连接返回到池
  • 默认情况下,提交事务时,会话将关闭,基础连接将关闭。如果使用连接池,数据库连接将返回到连接池

  • 根据Hibernate文档,Hibernate的早期版本需要显式断开和重新连接会话。这些 方法不推荐使用,因为事务的开头和结尾具有 同样的效果。它们如何具有相同的效果

  • 不推荐使用这些方法,因为现在由控制。

    对于我的第二个问题,您提到“默认情况下,当您提交事务时,会话将关闭…”。那么,为什么在我提交session.close()之后需要它,即session.getTransaction.commit()。我说的关闭会话和断开会话确实是两件不同的事情,对吗?您可以有一个会话和多个事务。这在扩展持久性上下文场景中发生。结束对话时,您有多个只读事务和一个写事务。那么“默认情况下,提交事务时,会话关闭”是什么意思?是不是每个请求使用声明性@Transaction进行会话?是的,对于每个请求的标准会话。