Hibernate中的Session和Connection之间有什么区别?

Shi*_*han 11 session hibernate database-connection jpa connection-pooling

我想清除基本的3点,

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

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

从Hibernate Documentation,早期版本的Hibernate需要显式断开连接并重新连接Session.不推荐使用这些方法,因为开始和结束事务具有相同的效果.它们如何产生同样的效果?

Vla*_*cea 16

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

有多种方法可以将Hibernate Session与数据库事务关联起来:

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

在数据库事务方面,有两种不同的方法:

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

  • JTA,使用多个DataSource.JTA 声明在每个语句之后应该积极地释放连接,但是它实践中仍然在单个逻辑事务的上下文中获得相同的JDBC连接句柄.

现在回到你的问题:

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

是.重新连接Hibernate会话,可以继续进行刷新/提交.

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

默认情况下,提交事务时,将关闭会话并关闭基础连接.如果使用连接池,则数据库连接确实将返回池.

  1. 从Hibernate Documentation,早期版本的Hibernate需要显式断开连接并重新连接Session.不推荐使用这些方法,因为开始和结束事务具有相同的效果.它们如何产生同样的效果?

不推荐使用这些方法,因为连接管理现在由连接释放模式控制.