我正在研究多租户存储网关。
每个租户都有自己的模式——每个租户的模式是一个元模式,因此每个租户模式都是相同的。数据库交互仅通过存储过程 API 发生。存储过程层位于公共架构上。存储过程依赖于设置为 的 search_path <TENANT_SCHEMA>;public
。
应用层针对公共模式中的存储过程准备语句。
我有一个用于切换租户的存储过程,如下所示:
CREATE OR REPLACE FUNCTION domains_switch(domain DOMAIN_NAME) RETURNS VOID AS $$ BEGIN
IF EXISTS (SELECT NULL FROM public.domains WHERE domain_name = domain) THEN
EXECUTE format('set search_path=%s,public;', domain);
ELSE
RAISE 'domain "%" does not exist',domain USING ERRCODE = 'AX001';
END IF;
RETURN; END;
$$ LANGUAGE plpgsql;
plpgsql
存储过程自己管理计划,这意味着我只需要为网关中的每个后端准备一次 api 语句。我怀疑当我切换模式时存储过程的内部缓存计划无效。
我计划在网关的连接池管理中添加一个层以最小化 search_path 开关。我的直觉是正确的吗?这是正确的做法吗?