会话与会话工厂之间的差异 - 休眠?
Posted
技术标签:
【中文标题】会话与会话工厂之间的差异 - 休眠?【英文标题】:Differences between session vs session factory - Hibernate? 【发布时间】:2014-04-23 15:19:05 【问题描述】:除了以下之外,我们还有其他区别吗?另外请验证以下是否正确
SessionFactory
对象是每个应用程序一个,Session
对象是每个客户端一个。
SessionFactory
是创建和管理Sessions
。 Session
是为
映射类,还可以访问更通用的Criteria API
。
SessionFactory
是线程安全的,而 Session
不是线程安全的
【问题讨论】:
是的,你快到了。SessionFactory 提供会话,你可以使用它与数据库交互。Factory 是线程安全的,因为它的类是不可变的 【参考方案1】:首先,询问这些接口之间的区别没有任何意义。好像在问汽车制造厂和汽车的区别。制造厂是生产汽车的地方。同样,SessionFactory
是一个将创建 Session
对象的实例。
【讨论】:
那么一个应用程序最多可以创建多少个会话? 我相信,您可以从同一个会话工厂创建任意数量的会话... 从工厂创建会话没有任何限制。事务完成后关闭会话 如果我在创建会话后销毁 sessionFactory,我的会话仍然有效吗? @Pere 我对此不太确定。但我的猜测是,即使工厂被毁,会话仍然存在。 cos session 不是工厂的复合对象。【参考方案2】:SessionFactory
是 Session
对象的工厂类。它适用于整个应用程序,而Session
仅适用于特定事务。
Session
是短暂的,而 SessionFactory
对象是长期存在的。 SessionFactory
提供二级缓存,Session
提供一级缓存。
【讨论】:
对我来说这应该被接受的答案【参考方案3】:SessionFactory 是一个接口。 SessionFactory 可以通过提供 Configuration 对象来创建,该对象将包含从 hibernate.cfg.xml 文件或 hibernate.properties 文件中提取的所有与 DB 相关的属性详细信息。 SessionFactory 是 Session 对象的工厂。
我们可以在任何应用程序中为每个数据库创建一个 SessionFactory 实现。如果您的应用程序引用多个数据库,那么您需要为每个数据库创建一个 SessionFactory。
SessionFactory 是一个重量级的对象;它通常在应用程序启动期间创建并保留以供以后使用。 SessionFactory 是一个线程安全的对象,由应用程序的所有线程使用。
会话用于获得与数据库的物理连接。 Session 对象是轻量级的,设计为在每次需要与数据库交互时实例化。持久对象通过 Session 对象进行保存和检索。
会话对象不应长时间保持打开状态,因为它们通常不是线程安全的,应根据需要创建和销毁它们。 Session的主要功能是为映射实体类的实例提供、创建、读取和删除操作。
【讨论】:
【参考方案4】:会话工厂:
-
每个数据源/数据库一个实例。
它是线程安全的。
它是一个重量级对象,因为它维护数据源、映射、休眠配置信息等。
Sessionfactory 将创建和管理会话。
如果您有 4 个数据源/数据库,那么您必须创建 4 个会话工厂实例。
sessionfactory 是一个不可变对象,它将在服务器初始化时作为单例创建。
会话:
-
每个客户端/线程/一个事务一个实例。
它不是线程安全的。
重量轻。
会话将使用 sessionfactory.openSession() 打开,一些数据库操作将完成,最后会话将使用 session.close() 关闭。
【讨论】:
【参考方案5】:SessionFactory 是 Hibernate 的单个数据存储的概念,并且是线程安全的,因此许多线程可以同时访问它,并为单个数据库请求会话和已编译映射的不可变缓存。
不,会话不是线程安全的。 Session 是一个轻量级且非线程安全的对象(不,您不能在线程之间共享它),它代表数据库的单个工作单元。会话由 SessionFactory 打开,然后在所有工作完成后关闭。 Session 是持久化服务的主要接口。会话延迟获取数据库连接(即仅在需要时)。
【讨论】:
【参考方案6】:主要区别在于“每个hibernate客户端应用程序只有一个会话工厂对象。因为SessionFactory接口的实现类是单例Java类”。
【讨论】:
【参考方案7】:会话工厂可以被认为是为我们提供特定数据源或数据库的会话的工厂。换句话说,如果我们的应用程序有多个数据库,那么我们应该创建与数据库数量一样多的会话工厂。所以,Session factory 是长期存在的。
Session 是用于对数据库执行离散事务的短暂实例。通常,在任何时候,如果需要对数据库进行事务,则会从相应的会话工厂实例中获取一个短暂的会话对象,并且在事务完成后,该实例不再可用。
【讨论】:
以上是关于会话与会话工厂之间的差异 - 休眠?的主要内容,如果未能解决你的问题,请参考以下文章