2016-04-20 48 views
0

這個想法是構建一個多線程應用程序,每個線程連接到相應的數據庫(單獨的端口號)。每個線程都會有一個進程(假設有A,B,C和D),並且每個進程可以有多個線程實例(例如2xA,1xB,0xC和3xD)同時運行。多線程應用程序中的Hibernate + Spring

我主要的兩個問題是:

  1. 運行時如何替換SessionFactory's url屬性數據庫端口?

  2. 如何限制Hibernate的Session訪問其他線程的Configuration

廣告1.我發現這個解決方案,這是整齊: https://spring.io/blog/2007/01/23/dynamic-datasource-routing/。但是,如果應用程序是單線程的,這隻能正常工作。否則,進程A和B在嘗試同時訪問數據庫時可能會遇到衝突。

廣告2.不太確定如何解決這個問題。 Spring是否足夠聰明地弄清楚哪個Configuration(最終是哪個數據庫url)對象要獲取以便與正確的Thread一起使用?

+0

*但是,如果應用程序是單線程*沒有這只是正常工作。爲什麼呢?閱讀文章:它從**線程綁定**上下文獲取數據源查找鍵。所以每個線程都有自己的查找鍵。 –

+0

您需要在xml或註釋中爲不同的數據庫創建不同的sessionFacotry條目; – Musaddique

+0

@JB Nizet所以你說的是Spring將'SessionFactory'連接到'Thread'沒有問題,對吧?或者,我是否還應該按照它的線程來標識bean? – JDelorean

回答

0

其實你可以用自己的dataSource創建多個sessionFactory。

並且在運行時您將發送sessionFacotry Name以從不同數據庫獲取數據。

SessionFactory sessionFactory=HibernateUtil.getSessionFactory(<sessionFactoryName>) 
Session session=sessionFactory.openSession(); 
     //block of code to execute  
session.close