Session和SessionFactory之间的区别 - Hibernate?

20

除了下面列出的,我们还有其他的区别吗?并请验证下面的内容是否正确

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

是的,你已经非常接近正确的方向了。SessionFactory提供会话,并且您可以使用它与数据库交互。由于它是不可变类,所以工厂是线程安全的。 - Kick
7个回答

34
< p>首先,询问这些接口之间的区别没有任何意义。这就好像询问汽车制造工厂和汽车之间的区别一样。制造工厂是生产汽车的地方。同样,SessionFactory是一个实例,它将创建Session对象。


1
一个应用程序最多可以创建多少个会话? - user2323036
我相信,您可以从同一会话工厂创建任意数量的会话... - Balaji Reddy
从工厂创建会话没有任何限制。在事务完成后,只需关闭会话即可。 - Kick
1
如果我在创建会话后销毁了我的sessionFactory,那么我的会话是否仍然存在? - Pere
@BalajiReddy,看起来不是这样的:在调用此方法之前,应用程序有责任确保没有打开的会话,因为对这些会话的影响是不确定的。https://docs.jboss.org/hibernate/orm/current/javadocs/org/hibernate/SessionFactory.html#close-- - Pere
显示剩余2条评论

26

SessionFactory是用于创建Session对象的工厂类。它在整个应用程序中可用,而Session仅在特定事务中可用。

Session的生命周期很短,而SessionFactory对象的生命周期很长。 SessionFactory提供第二级缓存,而Session提供第一级缓存。


对我来说,这应该是被接受的答案。 - Umar Tahir

12

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

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

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

Session 用于与数据库建立物理连接。Session 对象轻巧易用,设计用于每次需要与数据库进行交互时实例化。持久化对象通过 Session 对象保存和检索。

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


7

SessionFactory:

  1. 每个数据源/数据库只有一个实例。
  2. 它是线程安全的。
  3. 它是一个重量级对象,因为它维护数据源、映射、Hibernate配置信息等。
  4. SessionFactory将创建和管理会话(Session)。
  5. 如果您有4个数据源/数据库,则必须创建4个SessionFactory实例。
  6. SessionFactory是一个不可变对象,并且在服务器初始化时作为单例创建。

Session:

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

4

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

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


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

0

Session Factory 可以被视为工厂,它将为特定数据源或数据库产生会话。换句话说,如果我们的应用程序有多个数据库,则应创建与数据库数量相同的 Session Factory。因此,Session Factory 是长期存在的。

Session 是短暂的实例,用于执行离散的数据库事务。通常,在任何时候,如果需要与数据库进行交易,则从适当的 Session Factory 实例获取短暂的会话对象,并在完成交易后,该实例不再可用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接