具有多租户数据库结构的 ActiveJDBC

ActiveJDBC with multi-tenant DB structure

我有一个多租户数据库架构。有没有办法对多个相同的数据库使用一个活动模型?

一点说明:

我有一个 Foo exdends Model class 可以与 foo_table 一起使用。 foo_tableschemaA, schemaB, schameC 等中是相同的。我可以使用相同的 Foo class 对来自不同模式的每个表进行操作吗?

如果您的数据库具有相同的模式,您完全可以在多个数据库中使用相同的模型。事实上,当人们从一个数据库到另一个数据库进行 ETL 时,通常会这样做。

典型的程序如下所示:

Base.open(/*connection params*/);
List<Person> johns = Person.where("first_name = ?", "John");
Base.close();
  • Base.open() 打开一个连接并将其附加到当前线程。
  • 下一行 Person.where(..) 在线程上找到一个连接,并将其用于 select 记录。
  • Base.close() 在当前线程上找到一个连接并关闭它。

此外,ActiveJDBC 模型首次在 JVM 中使用时,会期望在当前线程上建立连接,并会从当前模式中提取元数据。这将确保:

这意味着在任何给定时间,模型假定它连接到具有用于获取元数据的相同结构的数据库。

接下来,这可能是您想要的:

Base.open(/*connection params for DB1*/);
List<Person> johns = Person.where("first_name = ?", "John");
Base.close();

Base.open(/*connection params for DB2*/);
for(Person person:johns){
    person.set("first_name", "Bill").setId(null).saveIt();
}
Base.close();

本质上,您将从一个数据库中读取数据,但会将其保存到另一个数据库中。

需要调用 person.setId(null) 以确保框架生成插入而不是更新,请参阅 http://javalite.io/surrogate_primary_keys