Hibernate中的会话和连接有什么区别?
我想澄清基本的三点 在旧会话上启动新数据库事务是否会获得 是否新建连接并恢复会话 提交数据库事务是否会断开会话与数据库的连接 JDBC连接并返回到池的连接 根据Hibernate文档,需要Hibernate的早期版本 会话的显式断开和重新连接。这些方法 不推荐使用,因为事务的开始和结束具有相同的 效果。它们如何具有相同的效果Hibernate中的会话和连接有什么区别?,hibernate,session,jpa,database-connection,connection-pooling,Hibernate,Session,Jpa,Database Connection,Connection Pooling,我想澄清基本的三点 在旧会话上启动新数据库事务是否会获得 是否新建连接并恢复会话 提交数据库事务是否会断开会话与数据库的连接 JDBC连接并返回到池的连接 根据Hibernate文档,需要Hibernate的早期版本 会话的显式断开和重新连接。这些方法 不推荐使用,因为事务的开始和结束具有相同的 效果。它们如何具有相同的效果 Hibernate会话只是一个事务性写后缓存,它将实体状态转换转换为DML语句。Hibernate会话可以与数据库连接或断开连接。断开连接后,它无法将当前挂起的实体状态更改
Hibernate会话只是一个事务性写后缓存,它将实体状态转换转换为DML语句。Hibernate会话可以与数据库连接或断开连接。断开连接后,它无法将当前挂起的实体状态更改刷新到基础数据库 有多种方法可以:
- 每个请求的会话(会话绑定到单个逻辑@事务和一个物理数据库事务的生命周期)
- 长对话(会话可以跨越多个@Transaction操作,因此涉及多个数据库事务)
- 使用单个数据源的RESOURCE_LOCAL事务将始终将物理数据库事务绑定到Hibernate会话(在单个逻辑事务的上下文中,这意味着您仍然可以实现跨越多个此类逻辑事务的长对话)
- JTA,使用多个数据源。JTA声明在每条语句之后应该主动释放连接,但实际上,在单个逻辑事务的上下文中仍然会得到相同的JDBC连接句柄
不推荐使用这些方法,因为现在由控制。对于我的第二个问题,您提到“默认情况下,当您提交事务时,会话将关闭…”。那么,为什么在我提交session.close()之后需要它,即session.getTransaction.commit()。我说的关闭会话和断开会话确实是两件不同的事情,对吗?您可以有一个会话和多个事务。这在扩展持久性上下文场景中发生。结束对话时,您有多个只读事务和一个写事务。那么“默认情况下,提交事务时,会话关闭”是什么意思?是不是每个请求使用声明性@Transaction进行会话?是的,对于每个请求的标准会话。