2013-03-19 84 views
2

我使用的是卡宴3.1B2目前作爲持久層對於某些Web服務。要求服務公開多個數據庫中的一個,所有數據庫都具有相同的模式,數據庫在服務操作被調用時被確定。 決定使用哪個數據庫需要基於調用服務的客戶端的身份。卡宴3.1 - 設置數據源動態

我該如何去定義它並在運行時使用它?看起來我應該定義2個datanode,它們都引用相同的數據映射,因爲我的所有實體在數據庫之間是相同的。

但在運行時,我會然後以某種方式建立兩個不同的情況下,每一個數據節點,如果是這樣我將如何指定爲每個上下文?

任何幫助表示讚賞 感謝

回答

2

我將創建一個數據圖和單數據節點的單個項目。刪除其「數據源廠」,因爲我們會在代碼中指定它(從來沒有嘗試過這一點,如果離開「數據源廠」空的原因在啓動時出現任何問題,你可以將它設置爲任何所提供的選擇,例如JNDIDataSourceFactory的,有理解這只是佔位符,並且在運行時會被忽略)。

現在使用同一個映射項目啓動2個ServerRuntimes,每次,但2組不同的數據源屬性。這些屬性會導致Cayenne忽略XML中設置的DataSource Factory。

Module m1 = new Module() { 

    @Override 
    public void configure(Binder binder) { 
     binder.bindMap(Constants.PROPERTIES_MAP) 
       .put(Constants.JDBC_DRIVER_PROPERTY, "com.my.Driver") 
       .put(Constants.JDBC_URL_PROPERTY, "jdbc://db1_url") 
       .put(Constants.JDBC_USERNAME_PROPERTY, "db1login") 
       .put(Constants.JDBC_PASSWORD_PROPERTY, "db1password"); 
    } 
}; 

Module m2 = new Module() { 

    @Override 
    public void configure(Binder binder) { 
     binder.bindMap(Constants.PROPERTIES_MAP) 
       .put(Constants.JDBC_DRIVER_PROPERTY, "com.my.Driver") 
       .put(Constants.JDBC_URL_PROPERTY, "jdbc://db2_url") 
       .put(Constants.JDBC_USERNAME_PROPERTY, "db2login") 
       .put(Constants.JDBC_PASSWORD_PROPERTY, "db2password"); 
    } 
}; 

ServerRuntime r1 = new ServerRuntime("cayenne-project.xml", m1); 
ServerRuntime r2 = new ServerRuntime("cayenne-project.xml", m2); 

R1和R2應該是應用單身,你可以創建任何一個適合各個請求ObjectContexts。如果您在請求之間重複使用ObjectContext(例如,這是一個大多數只讀應用程序),則可以從r1和r2創建2個上下文並緩存它們。

+1

非常感謝 - 這樣做的伎倆 – user1574741 2013-03-21 12:41:29