关于跨库操作与数据源自动复制

最后更新:2023-11-15 05:30:46 | 状态:未完成
在低代码与中台项目中经常需要操作多个数据库的元数据,如查询出所有数据库中的表。
但是需要注意:多个库中可以会出现同名的表。另外也有部分数据库不支持跨库,在每个库中单独维护一份系统表。
在实际业务中一般也不需要多个库的元数据同时显示或重,更多的是按库分类。

为了统一处理,推荐先列出数据库列表,再根据用户操作查询不同数据库。
在查询不同数据库时也尽量不要跨库查询,应该切换数据库
8.7.1及之后的版本中:数据库、数据源、AnylineService、DataRuntime是一一对应的,也就是切换数据源就相当于以上4个对象统一切换。
在实际应用中主要是通过service来操作DDL、DML及元数据
service可以通过ServiceProxy根据数据库名称获取
AnylineService crm_service = ServiceProxy.service("crm");

DatasourceHolder.copy("数据源名")可以自动为相同服务器上的每个数据库各创建一个数据源,数据源名称:源数据源名称_数据库名小写
如果不提供数据源名,则会用默认数据源default
如果服务器上有sso,erp,fico三个数据库,通过数据源sso自动创建其他数据库对应的数据源,则会再创建出sso_erp,sso_fico两个数据源
ServiceProxy.service("sso_erp")可以获取操作erp数据库的service

当sso注销时,根据sso创建的子源也会一块被注销

//根据数据源 创建当前数据源所在服务器的其他数据库相关的数据源
//当前服务器上还有simple_crm/simple_sso,以下会再创建两个数据源default_simple_crm/default_simple_sso
//注意数据名会转成小写、但前缀不会转小写,项目中定义的是什么就是什么
List<String> list = DatasourceHolder.copy();//不提供参数复制默认数据源 default
//也可以通过已有的service复制当前service关联数据源所在服务器
list = service.copy();
log.warn("创建数据源:{}", list);
//key已存在,不会重复创建
list = DatasourceHolder.copy("default");
log.warn("创建数据源:{}", list);
log.warn("全部数据源:{}", RuntimeHolder.all().keySet());
ServiceProxy.service("default_simple_sso").query("sso_user");
//注销主数据源时  复制出来的子源也一块注销
DatasourceHolder.destroy("default");

log.warn("全部数据源:{}", RuntimeHolder.all().keySet());


最近更新 搜索 提交