2

現在、一部のWebサービスの永続層としてCayenne3.1B2を使用しています。サービスには、すべて同じスキーマを持つ複数のデータベースの1つを公開する必要があります。データベースは、サービス操作が呼び出されたときに決定されます。どのデータベースを使用するかは、サービスを呼び出すクライアントのIDに基づいて決定する必要があります。

これを定義して実行時に使用するにはどうすればよいですか?すべてのエンティティがデータベース間で同じであるため、両方とも同じデータマップを参照する2つのデータノードを定義する必要があるようです。

しかし、実行時に、データノードごとに1つずつ、2つの異なるコンテキストを作成しますか?そうであれば、コンテキストごとにそれをどのように指定しますか?

助けていただければ幸いですありがとう

4

1 に答える 1

3

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つのコンテキストを作成し、それらをキャッシュすることもできます。

于 2013-03-20T06:10:41.867 に答える