其他線程已經涵蓋了類似的主題,但我找不到解決我的問題的確切解決方案。如何動態管理多個數據源
我們正在努力實現是設計一個Web應用程序,它能夠:
- 在啓動時讀取一個數據源配置(包含多個數據源定義的XML文件,該文件被放置在WAR文件外並且它不是應用上下文或休眠配置文件)
- 創建用於它們中的每一個會話工廠(考慮到每個數據源是與不同的模式的數據庫)在運行時基於用戶輸入不同的數據源
- 開關(用戶可以選擇他們想要使用的數據源)
- 提供正確的dao對象來管理用戶請求。
目前我們有一個DAO管理器對象,它可以讀取數據源配置文件並實例化多個會話工廠,並將它們保存在地圖中。每個會話工廠都使用包含適當的hibernate映射類(每個數據庫模式不同)的配置來創建。此外,我們有多個DAO接口及其實現,用於訪問「他們的數據庫」。
在這一點上,我們需要一種方法從DAO管理器獲取特定的DAO對象,包含正確的會話工廠附加,全部基於用戶請求(基本上來自上述服務的包含數據源ID或自定義數據源對象)。
理想情況下,服務層應該使用DAO管理器來獲取基於數據源ID(例如)的DAO對象,而不用擔心它的實際執行情況:DAO管理器將負責處理它,方法是創建正確的DAO對象並根據數據源ID在其中注入正確的會話工廠。
我的問題是:
- 這是一個很好的方法可循?
- 如何使用Spring爲每個DAO接口動態注入DAO管理器的多個DAO實現?
- 一旦創建了會話工廠,是否有辦法讓Spring處理它們,就像我通常在application-context.xml中使用依賴注入一樣?
- 對於每個會話工廠,第二級緩存是否仍然有效?
嗨肖恩,謝謝你的回覆。關於問題n.2(如何在DAO管理器中設置dao實現),我想通過DAO管理器中的application-context.xml靜態注入所有的DAO實現,以便它可以返回基於在某些輸入鑑別器上。你認爲這可能是一種方式嗎?回到你的建議,是否在DAO管理器中定義了setter?它會被春天「召喚」嗎?再次感謝。 – 2011-05-24 13:13:52
*你認爲這可能是一種方式?*是的,也許[使用限定符](http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans。 HTML#豆,自動裝配的註釋限定符)。 *是在DAO管理器中定義的setter嗎?它會被春天「召喚」嗎?*是的,是的,如果你開啓自動裝配 – 2011-05-24 13:17:00
再次感謝肖恩,自動裝配和限定符證明對我來說非常有用!所以現在我只需要弄清楚如何讓Spring管理我的會話工廠(如果可能的話)並且看看二級緩存會發生什麼。任何其他建議非常感謝。謝謝。 – 2011-05-25 09:15:00