Jes*_*sse 8 java postgresql hibernate jdbc playframework
我正在开发一个需要支持数千名用户的未来多租户Web应用程序.该应用程序正在基于Java的Play上构建!MVC框架使用JPA/Hibernate和postgreSQL.
我观看了Guy Naor关于在Rails中编写多租户应用程序的演讲,其中他谈到了多租户的几种方法(数据隔离随着你的列表而减少):
我选择了方法#2,其中某种用户ID从请求中解析出来,然后用于访问该用户表空间.SET search_path TO customer_schema,public在进行任何查询之前会给出postgres 命令,以确保客户的表是查询的目标.这可以通过Play@Before中控制器方法中的控制器注释轻松完成!(这是Guy在他的rails示例中使用的方法).postgres中的search_path的行为与$PATHOS中的行为完全相同; 真棒!
所有这些听起来都很棒,但是我在JDBC/Hibernate/JPA堆栈上实现它时遇到了困难,因为似乎没有办法在运行时动态切换模式.
似乎数据库连接是由连接工厂静态配置的(请参阅:如何使用hibernate管理一个数据库上的许多模式).我发现类似的问题与每个用户使用多个SessionFactorys的类似答案,但因为我理解SessionFactorys是重量级的对象,所以你可以支持数百个用户,更不用说成千上万的用户,走这条路线是不可信的.
我还没有完全认真地对待上面的#2,但我还没有完全抛弃#3方法.
您可以执行该命令
SET search_path TO customer_schema,public
Run Code Online (Sandbox Code Playgroud)
在同一个连接/会话/事务中,根据需要经常使用.这只是另一个命令SELECT 1;.更多在手册中.
当然,您也可以预设search_path每位用户.
ALTER ROLE foo SET search_path=foo, public;
Run Code Online (Sandbox Code Playgroud)
如果每个用户或其中许多用户具有与其用户名匹配的架构,则可以使用postgresql.conf中的默认设置:
search_path="$user",public;
Run Code Online (Sandbox Code Playgroud)
设置search_path此处的更多方法:
search_path如何影响标识符解析和"当前架构"
| 归档时间: |
|
| 查看次数: |
7362 次 |
| 最近记录: |