2012-06-20 108 views
2

我在PostgreSQL中有三個相同模式的單個數據庫。 現在我需要根據locale-key(存儲在用戶會話中)爲數據庫操作選擇特定模式。我發現某個地方這個東西類似於動態數據源路由。春季動態數據源路由

任何人都有什麼想法如何在Spring中實現這個? 這會影響事務管理嗎? 請儘量分享任何示例代碼。

任何建議,將不勝感激。 謝謝&此致敬禮。

回答

1

我建議使用這種方法:

  • 首先定義在Spring MVC配置的locale interceptor無論是基於會話或改變攔截。
  • 您現在可以使用LocaleContexHolder來獲取附加線程上的當前語言環境。
  • 使用the reference blog post來定義您的動態路由數據源。數據源路由器上的參數將來自語言環境。使用LocaleContextHolder來確定區域設置,然後使用它來確定應使用哪個數據源。
1

如果您有單個數據庫,那麼動態方面應該與連接池無關 - 所有連接仍然適用於單個數據庫。您只需在開始事務後動態設置適當的模式。

這可以通過使用高於<tx:annotation-driven />的順序來實現。在這方面,你應該獲得當前連接:

DataSourceUtils.getConnection(dataSource) 

,併發出以下PostgreSQL的聲明(見:http://www.postgresql.org/docs/9.1/static/sql-set.html以獲取有關schema參數);

set schema 'schemaname-on-the-basis-of-session-parameter'; 

另請參閱using schemas in postgres

至於事務管理 - 事務與物理連接和會話有關。另一方面的架構是一種名稱空間,因此您不必更改事務管理,只需在用戶請求處理期間的每個事務開始時設置當前架構。