gpt4 book ai didi

java - 在 PostgreSQL 中使用模式的 Hibernate 和 Multi-Tenancy 数据库

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:49:06 26 4
gpt4 key购买 nike

背景

我正在开发一个 future 的 Multi-Tenancy Web 应用程序,该应用程序需要支持数以千计的用户。该应用程序是在基于 Java 的 Play 之上构建的!使用 JPA/Hibernate 和 postgreSQL 的 MVC 框架。

我看了 Guy Naor 在 Writing Multi-tenant Applications in Rails 上的演讲他在其中谈到了几种 Multi-Tenancy 方法(数据隔离随着列表的向下移动而降低):

  1. 每个客户都有一个单独的数据库
  2. 一个数据库,每个客户都有单独的模式和表(表命名空间)。
  3. 一个数据库,其中包含一组包含客户 ID 列的表。

我选择了方法 #2,其中某种用户 ID 从请求中解析出来,然后用于访问该用户表空间。在进行任何查询之前给出 postgres SET search_path TO customer_schema,public 命令以确保客户的表是查询的目标。这可以通过 Play! 中 Controller 方法中的 @Before Controller 注释轻松完成(这是 Guy 在他的 Rails 示例中使用的方法)。 postgres 中的 search_path 与操作系统中的 $PATH 完全一样;太棒了!

这一切听起来不错,但我立即在 JDBC/Hibernate/JPA 堆栈上实现它时遇到了困难,因为似乎没有办法在运行时动态切换模式。

问题

如何让 JDBC 或 Hibernate 支持在运行时动态切换 postgres 模式?

数据库连接似乎是由连接工厂静态配置的(参见:How to manage many schemas on one database using hibernate)。我发现类似的问题和每个用户使用多个 SessionFactory 的类似答案,但由于我了解 SessionFactory 是重量级对象,因此您不可能支持数百名用户,更不用说数千名用户,走这条路。

我还没有完全致力于上面的方法 #2,但我也没有完全放弃方法 #3。

最佳答案

可以执行命令

SET search_path TO customer_schema,public

在同一个连接/ session /事务中,您需要的频率。它只是另一个命令,如 SELECT 1;。更多内容尽在 manual here .

当然,您也可以为每个用户预设search_path

ALTER ROLE foo SET search_path=foo, public;

如果每个用户或他们中的许多人都有与其用户名匹配的架构,您可以简单地使用 default setting in postgresql.conf :

search_path="$user",public;

设置search_path的更多方法这里:
How does the search_path influence identifier resolution and the "current schema"

关于java - 在 PostgreSQL 中使用模式的 Hibernate 和 Multi-Tenancy 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8349267/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com