Cayenne 3.1 - 动态设置数据源

时间:2013-03-19 17:45:56

标签: apache-cayenne

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

我如何定义它并在运行时使用它?看起来我应该定义2个数据节点,两者都引用相同的数据映射,因为我的所有实体在数据库之间是相同的。

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

感谢任何帮助 感谢

1 个答案:

答案 0 :(得分:3)

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

现在启动2个ServerRuntimes,每个使用相同的单个映射项目,但是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个上下文并缓存它们。