我正在开发一个多租户反应式应用程序,使用 Spring-Webflux + Spring-data-r2dbc 和 r2dbc 驱动程序连接到 Postgresql 数据库。多租户部分是基于模式的:每个租户一个模式。因此,根据上下文(例如用户登录),请求将命中数据库的特定架构。
我正在努力研究如何在 r2dbc 中实现这一点。理想情况下,这将是 Hibernate 使用MultiTenantConnectionProvider 的方式(参见示例 16.3)。
到目前为止我发现了什么以及我做了什么:
我查看了PostgresqlConnectionFactory。有趣的是,有prepareConnection一个电话setSchema(connection):
private Mono<Void> setSchema(PostgresqlConnection connection) {
if (this.configuration.getSchema() == null) {
return Mono.empty();
}
return connection.createStatement(String.format("SET SCHEMA '%s'", this.configuration.getSchema()))
.execute()
.then();
}
Run Code Online (Sandbox Code Playgroud)我可能需要找到一种方法来覆盖它,以便从上下文而不是配置中动态获取模式?
否则,我可以尝试将请求中的架构指定为表前缀:
String s = "tenant-1";
databaseClient.execute("SELECT * FROM \"" + s + "\".\"city\"")
.as(City.class)
.fetch()
.all()
Run Code Online (Sandbox Code Playgroud)但我不能再使用 SpringData,或者我需要重写每个请求以将租户作为参数传递。
任何提示/帮助表示赞赏:)