根据会话动态选择数据库

时间:2016-07-16 03:47:10

标签: java mysql hibernate jpa wildfly

我正在使用JPA和WildFly 10。

想象一下,两家不同的公司都有订阅使用我的应用程序。理想情况下,我想使用JPA将两家公司的数据拆分为单独的数据库,或者至少将单独的前缀表拆分。如果用户登录http://example.com/company1/,似乎应用程序与http://example.com/company2/上运行的应用程序完全分离,实际上,“两个”应用程序是一个应用程序的一部分。

多个用户可能同时从不同的公司登录,因此正在使用的数据库应该是基于会话的。

将数据拆分为单独的表或数据库的主要原因是为了更好地组织。使用一个应用程序而不是多个应用程序的原因是允许水平扩展。

我已经看到了创建多个persistence.xml文件的答案,但是我的应用程序应该根据当前活动的订阅动态创建和删除数据库或表。可以把它想象成一个网络托管公司,只要你支付,你就可以登录并开始在你的网站上工作;这就是我的方向。因此,我无法对不同的公司进行硬编码。

如何使用JPA完成此操作?它甚至可能吗?或者有更好的方法来实现我的目标吗?

1 个答案:

答案 0 :(得分:2)

您正在尝试使您的应用程序具有多租户功能。我知道的一种方式是:

  • 在每个数据库表中使用一个字段,其中包含租户的预定义值。
  • 当请求来自此租户时设置当前租户

  • 然后使用Hibernate过滤功能自动过滤特定于租户的数据。激活过滤器后,每个查询都只返回特定于当前租户的数据。

注意:在Hibernate Session对象上设置了一个Hibernate过滤器。如果您使用纯JPA,则实体管理器界面有一个名为getDelegate()的方法,它返回一个Hibernate会话对象。

Here是有关Hibernate过滤器信息的链接。还有关于如何在互联网上使用它们的教程。