会话与会话工厂之间的差异 - Hibernate?

时间:2014-03-18 05:19:29

标签: hibernate

除了以下之外,我们还有其他任何不同之处吗?另外请验证以下内容是否正确

  1. SessionFactory个对象是每个应用程序一个,Session个对象是每个客户端一个。
  2. SessionFactory用于创建和管理SessionsSession是为。提供CRUD接口 映射类,还可以访问更通用的Criteria API
  3. SessionFactory是线程安全的,因为Session不是线程安全的

7 个答案:

答案 0 :(得分:19)

首先,询问这些接口之间的区别并没有任何意义。似乎要问汽车制造厂和汽车之间的区别。制造工厂是生产汽车的地方。同样,SessionFactory是一个将创建Session个对象的实例。

答案 1 :(得分:12)

SessionFactorySession个对象的工厂类。它适用于整个应用程序,而Session仅适用于特定交易。

Session是短暂的,SessionFactory个对象是长寿的。 SessionFactory提供二级缓存,Session提供一级缓存。

答案 2 :(得分:3)

SessionFactory是Hibernate的单个数据存储的概念,并且是线程安全的,因此许多线程可以同时访问它并为单个数据库请求编译映射的会话和不可变缓存。

不,会话不是线程安全的。 Session是一个轻量级和非线程安全的对象(不,你不能在线程之间共享),它代表了数据库的单个工作单元。会话由SessionFactory打开,然后在所有工作完成后关闭。 Session是持久性服务的主要接口。会话懒惰地获得数据库连接(即仅在需要时)。

答案 3 :(得分:2)

会话工厂

  1. 每个数据源/数据库一个实例。
  2. 这是线程安全的。
  3. 这是一个重量级的对象,因为它维护数据源,映射,休眠配置信息等。
  4. Sessionfactory将创建和管理会话。
  5. 如果您说4个数据源/数据库,那么您必须创建4个会话工厂实例。
  6. sessionfactory是一个不可变的对象,当服务器初始化自身时,它将作为单例创建。

会话

  1. 每个客户端/线程/一个事务一个实例。
  2. 它不是线程安全的。
  3. 轻巧。
  4. 将使用sessionfactory.openSession()打开会话,并完成一些数据库操作,最后将使用session.close()关闭会话。

答案 4 :(得分:0)

主要区别在于"每个hibernate客户端应用程序只有一个会话工厂对象。因为SessionFactory接口的实现类是单例Java类"。

答案 5 :(得分:0)

SessionFactory 是一个接口。可以通过提供Configuration对象来创建SessionFactory,该对象将包含从hibernate.cfg.xml文件或hibernate.properties文件提取的所有与DB相关的属性详细信息。 SessionFactory是用于Session对象的工厂。

我们可以在任何应用程序中为每个数据库创建一个SessionFactory实现。如果您的应用程序引用多个数据库,则需要为每个数据库创建一个SessionFactory。

SessionFactory是一个重量级对象;它通常是在应用程序启动期间创建的,并保留以备后用。 SessionFactory是线程安全的对象,并由应用程序的所有线程使用。

会话用于获得与数据库的物理连接。 Session对象是轻量级的,旨在在每次需要与数据库进行交互时实例化。持久对象通过Session对象保存和检索。

会话对象不应长时间保持打开状态,因为它们通常不是线程安全的,因此应根据需要创建和销毁它们。会话的主要功能是为映射的实体类的实例提供,创建,读取和删除操作。

答案 6 :(得分:0)

会话工厂可以被认为是将为我们生成特定数据源或数据库的会话的工厂。换句话说,如果我们的应用程序具有多个数据库,那么我们应该创建与数据库数量一样多的会话工厂。因此,会话工厂是长期存在的。

会话是用于对数据库执行离散事务的短暂实例。通常,在任何时候,如果需要使用数据库进行事务处理,都会从适当的Session Factory实例中获得一个短暂的会话对象,并且在事务完成之后,该实例将不再可用。