【发布时间】:2012-01-11 01:34:30
【问题描述】:
背景
我正在开发一个未来需要支持数千名用户的多租户 Web 应用程序。该应用程序是在基于 Java 的 Play 之上构建的!使用 JPA/Hibernate 和 postgreSQL 的 MVC 框架。
我在 Writing Multi-tenant Applications in Rails 上观看了 Guy Naor 的演讲,他在其中谈到了多租户的一些方法(数据隔离随着列表的下降而减少):
- 每个客户都有一个单独的数据库
- 一个数据库,每个客户都有单独的架构和表(表命名空间)。
- 一个数据库,其中包含一组带有客户 ID 列的表。
我选择了方法 #2,其中某种用户 ID 从请求中解析出来,然后用于访问该用户表空间。在进行任何查询之前会给出 postgres SET search_path TO customer_schema,public 命令,以确保客户的表是查询的目标。这可以通过 Play! 的控制器方法中的 @Before 控制器注释轻松完成(这是 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。
【问题讨论】:
标签: java hibernate postgresql jdbc playframework