Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 为什么每个应用程序只使用一个SessionFactory对象?_Hibernate_Spring Mvc - Fatal编程技术网

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

Hibernate 为什么每个应用程序只使用一个SessionFactory对象?,hibernate,spring-mvc,Hibernate,Spring Mvc,为什么每个应用程序只使用一个SessionFactory对象?每个应用程序使用单会话工厂对象有什么好处?会话工厂对象将使用单例设计模式实现。SessionFactory的实例是线程安全的,通常在整个应用程序中共享。因为这些对象很重,因为它们包含连接信息、hibernate配置信息和映射文件、位置路径。因此,创建大量实例将使我们的应用程序变得非常重要。但是会话对象不是线程安全的。简而言之,SessionFactory对象是每个应用程序一个,会话对象是每个客户端一个 因此,每个数据源将有一个Sess

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

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

因此,每个数据源将有一个SessionFactory。应用程序可能有多个数据源,因此该实例中可能有多个SessionFactory。但您不希望在应用程序中多次创建SessionFactory

优势: 显然,这会提高应用程序的性能:)

更新- 摘自

SessionFactory的内部状态是不可变的。一旦是 此内部状态已设置。这种内部状态包括所有 关于对象/关系映射的元数据


因为创建
SessionFactory
是一个极其昂贵的过程,需要解析hibernate配置/映射属性并创建数据库连接池。创建数据库连接池需要建立数据库连接(即创建对象)由于定位数据库服务器、建立通信通道和交换信息以进行身份验证所需的时间,这会产生开销


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

关于每个应用程序一个SessionFactory对象,有一些关键点:-

1.单一数据存储:它是整个应用程序的单一数据存储。虽然可以有多个SessionFactory,但每个SessionFactory都有一个与之关联的不同数据库

2.线程安全:–SessionFactory是线程安全的,因此由于此功能,许多线程可以访问SessionFactory

3.不可变:-一旦创建SessionFactory的对象,您就不能更改或设置Session Facotyr的值。其内部状态在创建时设置

4.Singleton:–SessionFactory是在应用程序启动时构建的,它遵循Singleton设计模式

我希望这能回答你的问题


有关如何创建sessionfactory的更多详细信息,请参考URL:

Ya,理解sessionfactory遵循单例设计模式非常简单。因此,在孔应用程序中只能创建一个对象。SessionFactory也是线程安全的,因此一次只能执行一个线程及其代码。sessionFactory的实例是重量级的,因为它包含连接、hibernate配置、映射文件、位置路径,所以如果您创建sessionFactory实例的数量,那么您的代码将变得非常繁重。由于这个原因,我们只为一个应用程序使用一个sessionFactory实例。为了提高应用程序的性能,我们在一个应用程序中只使用一个sessionFactory实例

有关更多详细信息,请参阅此处否您错了DarkHorse SessionFactory不是使用singleton设计模式实现的。@DarkHorse SessionFactory不是singleton,它用作singleton,它是不可变的。下面的答案是,内存问题来自为每个请求创建SessionFactory。然而,您的回答似乎暗示这是不可能的,因为SessionFactory已经是一个单例。