当前位置: 首页 > 面试题库 >

在PostgreSQL中使用架构的休眠和多租户数据库

陶烨赫
2023-03-14
问题内容

我正在开发将来的多租户Web应用程序,它将需要支持数千个用户。该应用程序是在基于Java的Play之上构建的!使用JPA /
Hibernate和postgreSQL的MVC框架。

我看了盖伊·纳尔(Guy
Naor)关于在Rails中编写多租户应用程序的演讲,其中他谈到了几种多租户方法(数据隔离度随着列表的增加而降低):

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

我选择了方法2,从请求中解析出某种用户ID,然后将其用于访问该用户的表空间。SET search_path TO customer_schema,public在进行任何查询之前,都会发出一个postgres 命令,以确保客户的表是查询的目标。使用
Play!@Before中控制器方法中的控制器注释可以轻松完成此操作 (这是Guy在他的rails示例中使用的方法)。postgres中的
search_path 的行为与$PATH操作系统中的行为完全相同。太棒了!

所有这些听起来都很棒,但是在JDBC / Hibernate / JPA堆栈之上实现它时,我立即遇到了困难,因为似乎没有一种在运行时动态切换模式的方法。

问题

如何获取JDBC或Hibernate以在运行时支持动态切换Postgres模式?

似乎数据库连接是由连接工厂静态配置的(请参阅:如何使用hibernate在一个数据库上管理许多模式)。我发现类似的问题,每个用户使用多个SessionFactory的答案类似,但是由于我了解SessionFactory是重量级的对象,因此您不能支持数百个用户,更不用说数千个用户了。

我还没有完全致力于上面的方法2,但是我也没有完全放弃它来使用方法3。


问题答案:

您可以执行命令

SET search_path TO customer_schema,public

在相同的连接/会话/事务内,根据需要进行操作。这只是的另一个命令SELECT 1;。在手册中有更多信息。

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

ALTER ROLE foo SET search_path=foo, public;

如果每个用户或其中许多用户都有与其用户名匹配的架构,则可以简单地使用postgresql.conf中的默认设置:

search_path="$user",public;

设置search_path此处的更多方法:
search_path如何影响标识符解析和“当前模式”



 类似资料:
  • 问题内容: 我正在使用hibernate 4和spring 4为Java Web应用程序设置多租户支持。默认模式是在应用程序启动时创建和设置的。当不尝试支持多租户时,此架构可以正常工作。 现在,我需要为每个创建帐户的新租户创建一个架构。该模式可以简单地是通用模式的副本,因为它将遵循相同的格式。 如何在运行时创建与默认架构相同格式的新架构?似乎在实例化LocalSessionFactoryBean时

  • 问题内容: 我正在尝试使Spring-Data JPA与Hibernate一起使用自定义的MultiTenantConnectionProvider。 我下面的配置中的所有内容似乎都可以正常工作。我的类被称为每次我尝试调用库方法。 主要问题是无法提供租户标识符。Spring-Data提供的Repository接口负责获取Hibernate Session。 有什么方法可以向Spring-Data提

  • 问题内容: 有人知道如何在hibernate配置中添加另一个数据源,以及如何在自己的DAO中将Spring配置为其自动注入该数据源吗? 这是我的带有一个数据源的代码,可以完美运行,但是我不知道如何添加另一个数据源。我想添加另一个数据源,该数据源是具有与实际数据库不同的表的数据库。 HIBERNATE CONF 道例 问题答案: 好。我找到了另一个解决方案,并且使用了相同的方法:添加另一个dataS

  • 问题内容: 当我尝试通过JPA / hibernate持久保存一个名为“用户”的实体时,它将无法正常工作。该表未创建,原因是用户是postgresql中的保留字。除了给表命名以外,还有其他方法可以使此工作吗? 问题答案: 要引用标识符,请使用反勾号: 从Hibernate的测试套件中查看以下示例: https://github.com/hibernate/hibernate-orm/blob/ma

  • 我想知道如何为每个租户提供定制。我想提供在租户想要的每种形式中添加新字段的设施,包括字段名、数据类型等。现在我的问题是如何为这种类型的场景设计数据库表?正如我所想的那样,我们必须给每个表单赋予表单id,每当租户在表单中创建新字段时,应该在数据库表中创建一个新的行,该行应该具有租户id、表单id、字段名称、数据类型等... 现在请给我真正的解决方案的朋友......我需要这个数据库表设计解决方案立即

  • 问题内容: 我们的Java应用程序有大约100个类映射到数据库(SQL Server或MySQL)。我们使用Hibernate作为我们的ORM(带有XML映射文件)。 我们在数据库架构中指定约束。我们的大多数约束条件也都指定了。 我们最近开始启用Hibernate 2级缓存(适用于流行的实体和集合),以缓解一些性能问题。 自从启用第二级缓存以来,性能得到了提高。但是,我们也开始遇到ObjectNo