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

时间:2015-02-12 20:11:00

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

我想清除基本的3点,

  

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

     

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

     

从Hibernate Documentation,需要早期版本的Hibernate   显式断开连接并重新连接会话。这些方法   不推荐使用,asbuginning和结束事务具有相同的功能   影响。他们如何产生同样的效果?

1 个答案:

答案 0 :(得分:11)

Hibernate会话只是一个将write-behind cache转换为DML语句的事务性entity state transitions。 Hibernate会话可以与数据库连接或断开连接。当它断开连接时,它无法将当前暂挂的实体状态更改刷新到底层数据库。

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

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

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

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

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

现在回到你的问题:

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

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

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

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

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

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