2011-05-24 85 views
2

其他線程已經涵蓋了類似的主題,但我找不到解決我的問題的確切解決方案。如何動態管理多個數據源

我們正在努力實現是設計一個Web應用程序,它能夠:

  1. 在啓動時讀取一個數據源配置(包含多個數據源定義的XML文件,該文件被放置在WAR文件外並且它不是應用上下文或休眠配置文件)
  2. 創建用於它們中的每一個會話工廠(考慮到每個數據源是與不同的模式的數據庫)在運行時基於用戶輸入不同的數據源
  3. 開關(用戶可以選擇他們想要使用的數據源)
  4. 提供正確的dao對象來管理用戶請求。

目前我們有一個DAO管理器對象,它可以讀取數據源配置文件並實例化多個會話工廠,並將它們保存在地圖中。每個會話工廠都使用包含適當的hibernate映射類(每個數據庫模式不同)的配置來創建。此外,我們有多個DAO接口及其實現,用於訪問「他們的數據庫」。

在這一點上,我們需要一種方法從DAO管理器獲取特定的DAO對象,包含正確的會話工廠附加,全部基於用戶請求(基本上來自上述服務的包含數據源ID或自定義數據源對象)。

理想情況下,服務層應該使用DAO管理器來獲取基於數據源ID(例如)的DAO對象,而不用擔心它的實際執行情況:DAO管理器將負責處理它,方法是創建正確的DAO對象並根據數據源ID在其中注入正確的會話工廠。

我的問題是:

  • 這是一個很好的方法可循?
  • 如何使用Spring爲每個DAO接口動態注入DAO管理器的多個DAO實現?
  • 一旦創建了會話工廠,是否有辦法讓Spring處理它們,就像我通常在application-context.xml中使用依賴注入一樣?
  • 對於每個會話工廠,第二級緩存是否仍然有效?

回答

1

這是一個很好的方法嗎?

這可能是唯一可能的方法。所以,是的。

我如何可以使用Spring動態 注入在DAO中管理多個DAO 實現每個DAO 接口?

動態?我以爲你想在啓動時做到這一點。如果是這樣,只是提供一個列表或數組的訪問:

public void setMyDaos(List<Mydao> daos){ 
    this.daos = daos; 
} 

一旦會話工廠是 創建的,是有辦法讓Spring 處理它們,因爲我通常會做 與依賴注入在 application-context.xml裏面?

這是一個艱難的。我會說你可能必須存儲你的sessionFactory bean在scope=session

+0

嗨肖恩,謝謝你的回覆。關於問題n.2(如何在DAO管理器中設置dao實現),我想通過DAO管理器中的application-context.xml靜態注入所有的DAO實現,以便它可以返回基於在某些輸入鑑別器上。你認爲這可能是一種方式嗎?回到你的建議,是否在DAO管理器中定義了setter?它會被春天「召喚」嗎?再次感謝。 – 2011-05-24 13:13:52

+0

*你認爲這可能是一種方式?*是的,也許[使用限定符](http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans。 HTML#豆,自動裝配的註釋限定符)。 *是在DAO管理器中定義的setter嗎?它會被春天「召喚」嗎?*是的,是的,如果你開啓自動裝配 – 2011-05-24 13:17:00

+0

再次感謝肖恩,自動裝配和限定符證明對我來說非常有用!所以現在我只需要弄清楚如何讓Spring管理我的會話工廠(如果可能的話)並且看看二級緩存會發生什麼。任何其他建議非常感謝。謝謝。 – 2011-05-25 09:15:00