我目前使用 Cayenne 3.1B2 作为一些 Web 服务的持久层。服务需要公开几个数据库之一,所有数据库都具有相同的模式,在调用服务操作时确定数据库。使用哪个数据库的决定需要基于调用服务的客户端的身份。
我将如何定义它并在运行时使用它?似乎我应该定义 2 个数据节点,它们都引用同一个数据图,因为我的所有实体在数据库之间都是相同的。
但是在运行时,我会以某种方式创建两个不同的上下文,每个数据节点一个,如果是这样,我将如何为每个上下文指定它?
感谢任何帮助谢谢
我目前使用 Cayenne 3.1B2 作为一些 Web 服务的持久层。服务需要公开几个数据库之一,所有数据库都具有相同的模式,在调用服务操作时确定数据库。使用哪个数据库的决定需要基于调用服务的客户端的身份。
我将如何定义它并在运行时使用它?似乎我应该定义 2 个数据节点,它们都引用同一个数据图,因为我的所有实体在数据库之间都是相同的。
但是在运行时,我会以某种方式创建两个不同的上下文,每个数据节点一个,如果是这样,我将如何为每个上下文指定它?
感谢任何帮助谢谢
我将使用 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 个上下文并缓存它们。