DataMapと単一のDataNodeを使用して単一のプロジェクトを作成します。コードで指定する「DataSourceFactory」を削除します(これを試したことはありません。「DataSourceFactory」を空のままにしておくと起動時に問題が発生する場合は、JNDIDataSourceFactoryなどの提供された選択肢のいずれかに設定できます。これは単なるプレースホルダーであり、実行時には無視されることを理解してください)。
次に、2つのServerRuntimesを開始します。それぞれ、同じ単一のマッピングプロジェクトを使用しますが、データソースの2つの異なるプロパティセットを使用します。これらのプロパティにより、CayenneはXMLで設定されたDataSourceFactoryを無視します。
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はアプリケーションのシングルトンである必要があり、各リクエストに応じて、どちらかからObjectContextを作成できます。リクエスト間でObjectContextsを再利用している場合(たとえば、これはほとんど読み取り専用のアプリです)、r1とr2から2つのコンテキストを作成し、それらをキャッシュすることもできます。