我兩年前面臨着同樣的問題,我最終選擇基於一個「春自定義範圍」(http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-factory-scopes-custom)的實現。
Spring框架允許同一個bean定義的多個實例共同共存。它們僅與某些上下文環境不同。
例如,這個bean定義將根據當前處理的HTTP請求創建不同的LoginAction豆
<bean id="loginAction" class="com.foo.LoginAction" scope="request"/>
如果你創建了一個名爲「域」的自定義的範圍,你將能夠實例化幾個數據源的基礎上相同的bean定義。
基於JndiObjectFactoryBean的數據源bean定義將讓servlet容器管理數據庫連接(通過web.xml文件)。然而,你將不得不用Spring屬性來改變你的數據源名稱。
類似數據庫事務管理器的Bean也必須標記爲該範圍。
接下來,您需要一個HTTP請求運行每次啓動範圍:我可以建議你來定義數據源名稱作爲請求URL的前綴。
因爲大多數Web框架允許你攔截HTTP請求,可以處理請求之前取得預期的數據源。
然後,創建(或重用)一組專用於選定的數據源豆子,並將其存儲一個ThreadLocal變量中(您的自定義範圍的實施將依靠)
此實現應該看看乍一看有點複雜,但其用法看起來透明。