2013-01-19 24 views

回答

33

會話工廠對象將使用單例設計模式來實現。 SessionFactory的實例是線程安全的並且通常在整個應用程序中共享。由於這些對象包含連接信息,hibernate配置信息和映射文件以及位置路徑,因此這些對象的權重很重。所以創建實例數量將使我們的應用程序重量級。但會話對象不是線程安全的。簡而言之,SessionFactory對象是每個應用程序一個,Session對象每個客戶端一個。

因此,它將是每個DataSource一個SessionFactory。您的應用程序可能有多個DataSource,因此您可能在該實例中擁有多個SessionFactory。但是您不希望在應用程序中多次創建SessionFactory。

優勢: 顯然它的應用程序提高性能:)

更新 - 摘自Hibernate Doc

一個SessionFactory的內部狀態是不可改變的。一旦創建了這個內部狀態 被設置。該內部狀態包括關於對象/關係映射的元數據的所有 。

+2

不,你錯了DarkHorse SessionFactory沒有使用單例設計模式實現。 –

+3

@DarkHorse SessionFactory不是Singleton,它用作單例,它是不可變的http://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/SessionFactory.html – anshulkatta

14

由於SessionFactory的創建是一個極其昂貴的過程,其中涉及解析Hibernate配置/映射屬性和創建數據庫連接池.Creating數據庫連接池,需要建立數據庫連接(即創建Connection對象),其具有的開銷因查找數據庫服務器所需的時間,建立通信通道和交換信息以進行身份​​驗證。

因此,如果您爲每個請求創建SessionFactory,這意味着您沒有使用數據庫連接池來處理您的請求。您必須爲每個請求設置一個新的連接,而不是僅僅獲取已打開的來自數據庫連接池的連接。

2

有關於每個應用程序的一個SessionFactory對象的一些關鍵點: -

1.單數據存儲: - 它是對整個應用程序單獨的數據存儲。儘管可以有多個SessionFactory,但每個SessionFactory都會有一個與之關聯的不同數據庫。

2.線程安全: - SessionFactory是線程安全的,因此許多線程都可以訪問SessionFactory。

3.不可變: - 創建SessionFactory的對象後,您無法更改或設置Session Facotyr的值。其內部狀態是在創建時設置的。

4.Singleton: - SessionFactory是在應用程序啓動時構建的,它遵循單例設計模式。

我希望這會回答你的問題..

有關如何創建SessionFactory的請有參考網址詳情:http://techpost360.blogspot.in/2015/07/what-is-hibernate-sessionfactory.html

2

雅,它非常簡單明白這個SessionFactory遵循singleton設計模式。所以你可以在孔應用中只創建一個對象。 SessionFactory也是線程安全的,因此一次只能有一個線程執行其代碼。 sessionFactory的實例被加重,因爲它包含連接,hibernate配置,映射文件,位置路徑,所以如果你創建了sessionFactory的實例數,那麼你的代碼變得非常沉重。由於這個原因,我們只爲一個應用程序使用一個sessionFactory實例。爲了提高應用程序的性能,我們在一個應用程序中只使用一個sessionFactory實例。

相關問題