我目前使用 Cayenne 3.1B2 作为某些 Web 服务的持久层。服务需要公开多个数据库之一,所有数据库都具有相同的架构,在调用服务操作时确定数据库。
使用哪个数据库的决定需要基于调用服务的客户端的身份。
我将如何定义它并在运行时使用它?看来我应该定义 2 个数据节点,它们都引用相同的数据图,因为我的所有实体在数据库之间都是相同的。
但是在运行时,我是否会以某种方式创建两个不同的上下文,每个数据节点一个,如果是的话,我将如何为每个上下文指定它?
任何帮助表示赞赏
谢谢
我将使用 DataMap 和单个 DataNode 创建一个项目。删除其“DataSource Factory”,因为我们将在代码中指定它(从未尝试过此操作,如果将“DataSource Factory”保留为空会导致启动时出现任何问题,您可以将其设置为任何提供的选项,例如 JNDIDataSourceFactory,并使用了解这只是占位符,将在运行时被忽略)。
现在启动 2 个 ServerRuntime,每个都使用相同的单个映射项目,但数据源有 2 个不同的属性集。这些属性导致 Cayenne 忽略 XML 中设置的数据源工厂。
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。如果您在请求之间重用 ObjectContext(例如,这是一个主要是只读的应用程序),您可以从 r1 和 r2 创建 2 个上下文并缓存它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)