Jakarta ee 应用程序管理中每个会话的EntityManagerFactory

Jakarta ee 应用程序管理中每个会话的EntityManagerFactory,jakarta-ee,ejb-3.0,jpa-2.0,eclipselink,Jakarta Ee,Ejb 3.0,Jpa 2.0,Eclipselink,我必须在运行时更改我的多租户SaaS应用程序中的默认模式。(共享数据库-分离模式)。基本上,每个客户都会有自己的模式(由于某些保密原因而采用这种方式设计),并且基于他们的登录凭据,他们将在登录后连接到特定的模式 我使用JPA2.0和eclipselink作为持久性提供者 当我创建方法scope EntityManager时,我想创建一个单例EMF,它是应用程序作用域,并将模式名称传递给createEntityManager,但我注意到模式属性只能传递给createEntityManager(),

我必须在运行时更改我的多租户SaaS应用程序中的默认模式。(共享数据库-分离模式)。基本上,每个客户都会有自己的模式(由于某些保密原因而采用这种方式设计),并且基于他们的登录凭据,他们将在登录后连接到特定的模式

我使用JPA2.0和eclipselink作为持久性提供者

当我创建方法scope EntityManager时,我想创建一个单例EMF,它是应用程序作用域,并将模式名称传递给createEntityManager,但我注意到模式属性只能传递给createEntityManager(),因此我必须为每个会话(@SessionScope)创建一个EMF并在每个业务方法中从EMF创建Em

这个设计对我描述的场景有意义吗

有什么建议吗


提前感谢

我没有这种多租户设置的经验,但您将从每个人共享的一个唯一EMF转变为每个用户共享一个EMF


你太过分了。正确的粒度应该是每个数据库模式一个EMF。使用同一模式的两个用户(以及两个HTTP会话)没有理由拥有两个不同的EMF。

我没有这种多租户设置的经验,但您将从每个人共享的一个唯一EMF变成每个用户一个EMF


你太过分了。正确的粒度应该是每个数据库模式一个EMF。使用相同模式的两个用户(以及两个HTTP会话)没有理由拥有两个不同的EMF。

我同意。您最好拥有自己的EntityManagerFactory缓存,该缓存由模式设置密钥。如何以编程方式为每个数据库模式创建一个EMF?我知道我可以将它们放在persistence.xml中,但如果我向我的应用程序添加一个租户,会发生什么?我想我必须在此时重新启动应用程序服务器?是否有任何方法可以将新的“persistence unit”添加到persistence.xml,并重新加载应用程序服务器(sun glassfish),而不是重新启动。因为我无法处理每次添加其他租户时重新启动应用程序的问题。还有一件事是;假设我将有500个租户,这意味着我将有500个“持久性单元”,这对性能是否合适?另外,对我来说,另一个要求是每个租户将有不同的用户以不同的权限登录。这就是为什么我认为EM创建应该基于会话。请让我知道,如果我在任何时候都错了,提前感谢这是一个完全不同的(尽管很重要)问题。根据你的问题,我认为这是你已经解决的问题。正如我所说,我没有任何多租户应用的经验,我也无法回答。好吧,多租户支持是一个难题,而且是一项正在进行的工作,在JPA中还没有标准化。我同意。您最好拥有自己的EntityManagerFactory缓存,该缓存由模式设置密钥。如何以编程方式为每个数据库模式创建一个EMF?我知道我可以将它们放在persistence.xml中,但如果我向我的应用程序添加一个租户,会发生什么?我想我必须在此时重新启动应用程序服务器?是否有任何方法可以将新的“persistence unit”添加到persistence.xml,并重新加载应用程序服务器(sun glassfish),而不是重新启动。因为我无法处理每次添加其他租户时重新启动应用程序的问题。还有一件事是;假设我将有500个租户,这意味着我将有500个“持久性单元”,这对性能是否合适?另外,对我来说,另一个要求是每个租户将有不同的用户以不同的权限登录。这就是为什么我认为EM创建应该基于会话。请让我知道,如果我在任何时候都错了,提前感谢这是一个完全不同的(尽管很重要)问题。根据你的问题,我认为这是你已经解决的问题。正如我所说,我没有任何多租户应用的经验,我也无法回答。另外,多租户支持是一个难题,而且是一项正在进行的工作,在JPA中还没有标准化。