为什么每个应用程序只使用一个SessionFactory对象?

Vir*_*mal 25 hibernate spring-mvc

为什么每个应用程序只使用一个SessionFactory对象?每个应用程序使用单个会话工厂对象有什么好处?

Dar*_*rse 40

会话工厂对象将使用单例设计模式实现.SessionFactory的实例是线程安全的,通常在整个应用程序中共享.由于这些对象包含连接信息,hibernate配置信息和映射文件,位置路径,因此这些对象的权重很大.因此,创建实例数将使我们的应用程序变得更加重要.但是会话对象不是线程安全的.简而言之,它是 - 每个应用程序一个SessionFactory对象,每个客户端一个Session对象.

因此,每个DataSource将是一个SessionFactory.您的应用程序可能有多个DataSource,因此您可能在该实例中有多个SessionFactory.但是您不希望在应用程序中多次创建SessionFactory.

优点:显然它改善了你的应用程序的性能:)

更新 - 从Hibernate Doc中提取

SessionFactory的内部状态是不可变的.创建后,将设置此内部状态.此内部状态包括有关对象/关系映射的所有元数据.

  • @DarkHorse会话工厂不是单件,它被用作单,它是不可变的http://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/SessionFactory.html (3认同)
  • 不,你错了DarkHorse SessionFactory没有使用单例设计模式实现. (2认同)

Ken*_*han 16

因为创建a SessionFactory是一个非常昂贵的过程,涉及解析hibernate配置/映射属性和创建数据库连接池.创建数据库连接池需要建立数据库连接(即创建Connection对象),由于找到DB所花费的时间而产生开销服务器,建立通信信道和交换信息进行认证.

因此,如果您SessionFactory 为每个请求创建一个,则意味着您没有使用数据库连接池来处理您的请求.您必须通过上述过程为每个请求设置一个新连接,而不是仅仅从数据库连接获取打开的连接池.