2012-05-09 59 views
21

我理解数据库事务概念的一般理解。我们访问事务内的数据库以确保ACID属性。什么是数据库会话?

在Hibernate中有一个叫做会话的概念。会议有什么用途?数据库访问何时应该在两个会话中发生,而不是在同一会话中发生?

为了解释更多,我已经看到了Hibernate的代码

  • 会从一个会话工厂
  • 会话打开一个会话
  • 开始交易
  • 提交事务
  • 关闭会议

我需要知道这里会议的重要性是什么?为什么不像事务工厂那样,开始事务并提交事务?

+1

“数据库访问何时应该在两个会话中发生,而不是在同一个会话中?” https://developer.atlassian.com/display/CONFDEV/Hibernate+Sessions+and+Transaction+Management+Guidelines –

+0

仅供参考 - 有一个维基百科页面:http://en.wikipedia.org/wiki/Session_(computer_science) –

回答

18

会话不仅仅是一个事务,它是一个实现UnitOfWork模式。换句话说,它支持加载的对象,知道哪些对象必须被持久化等:

工作单元跟踪您在业务事务期间可能会影响数据库的所有工作。完成后,它会根据您的工作计算出需要执行的任何操作来更改数据库。

为了更好地理解Session和Transaction之间的关系,你可以看看this article

单个Hibernate Session可能与单个数据库事务具有相同的范围。

这是用于会话每请求实现模式的最常用的编程模型。单个Session和单个数据库事务实现特定请求事件(例如Web应用程序中的Http请求)的处理。千万不要使用每个操作的会话反模式! (有极少数的例外时的session-per-操作可能是合适的,你不会遇到这些,如果你刚开始学习的Hibernate。)

另一种编程模型是长对话的是,如一个实现多步对话的应用程序,例如向导对话框,用于在多个请求/响应周期中与用户进行交互。 实现这一点的一种方式是session-per-request-with-detached-objects模式。一旦持久对象在用户思考期间被认为是分离的,并且在修改之后必须重新附加到新的会话。

但是建议使用会话每会话模式。在这种情况下,单个Session的范围比单个数据库事务的范围更大,并且可能跨越多个数据库事务。每个请求事件都在单个数据库事务中处理,但会话的刷新将延迟到对话结束和最后一次数据库事务结束,以使对话成为原子。会话在用户思考期间保持断开状态,没有开放的数据库连接。 Hibernate的自动乐观并发控制(使用版本控制)用于提供对话隔离。

5

@Dmitry已经很好地回答了。

查看会话的另一种方式是数据库使用实例。创建会话时,您可以为任何数据库与其中所需的支持服务(例如事务,缓存,连接等)交互准备好上下文。交易是会话中使用的独立服务。

此外,会话是典型的OR映射工具(如hibernate)使用的第一级缓存。会话充当根据请求创建的临时上下文,以促进数据库交互。