2

我目前使用 Cayenne 3.1B2 作为一些 Web 服务的持久层。服务需要公开几个数据库之一,所有数据库都具有相同的模式,在调用服务操作时确定数据库。使用哪个数据库的决定需要基于调用服务的客户端的身份。

我将如何定义它并在运行时使用它?似乎我应该定义 2 个数据节点,它们都引用同一个数据图,因为我的所有实体在数据库之间都是相同的。

但是在运行时,我会以某种方式创建两个不同的上下文,每个数据节点一个,如果是这样,我将如何为每个上下文指定它?

感谢任何帮助谢谢

4

1 回答 1

3

我将使用 DataMap 和单个 DataNode 创建一个项目。删除它的“DataSource Factory”,因为我们将在代码中指定它(从未尝试过,如果将“DataSource Factory”留空导致启动时出现任何问题,您可以将其设置为任何提供的选项,例如 JNDIDataSourceFactory,带有理解这只是占位符,将在运行时被忽略)。

现在启动您的 2 个 ServerRuntime,每个都使用同一个映射项目,但 DataSource 有 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。如果您在请求之间重用 ObjectContexts(例如,这是一个主要是只读的应用程序),您可以从 r1 和 r2 创建 2 个上下文并缓存它们。

于 2013-03-20T06:10:41.867 回答