2017-08-11 81 views
3

這是一個非常基本的問題,但我需要幫助。假設我們在spring中創建一個singleton bean,那麼Spring的ioc會創建該特定bean的單個實例,並且當某種代碼需要它注入時,這很好。但我很困惑它將如何由多線程環境來管理。就像我們在spring中將sesssionFactory bean作爲單例一樣,然後向需要sessionFactory bean的特定休息url發出很多請求。 Spring框架如何將bean的單個實例提供給那麼多請求。SessionFactory實例如何在(Spring MVC)Web請求中處理?

回答

4

你在談論持久性提供者會話工廠,例如, Hibernate SessionFactory

對於每個DataSource,這個工廠應該存在一次,因爲創建(連接處理,內存消耗)不是很便宜,並且應該在整個應用程序生命週期中重用,所以單點就是在這一點上的方法。工廠是不可變的(線程安全的),並且不會有併發問題。

每個傳入的線程(由web請求創建)應該重用該工廠來創建它自己的會話,無論訪問多長時間(例如存儲在線程局部變量中),該會話都應該用於該線程。

E.g.如果我們現在將抽象層升級到JPA級別,則JPA EntityManagerFactory正在包裝Hibernate SessionFactory,如果您想將JPA掛件用於休眠會話 - EntityManager - 並且您希望讓Spring管理它,您將獲得一個EntityManager的代理這樣的:

@PersistenceContext 
private EntityManager entityManager; 

這將提供了EntityManager代理(包裹會議)當前線程對您的業務代碼。

同樣是有效的抽象的一個新的水平,如果你使用Spring Data JPA,它的資料庫和@Transactional方法。在這種情況下,Spring也會爲你處理。

+0

是否每個Web請求都創建一個新線程? –

+0

是的,每個請求都是一個單獨的線程。 –

+0

謝謝你。你解釋得很好。現在我明白了SessionFactory如何用作單例bean。但我也想知道,在併發web請求時如何使用singleton bean(由@Component註釋生成)? –