Jakarta ee 一个动态EntityManager,连接到多个数据库,即transaction type=“JTA​​"

Jakarta ee 一个动态EntityManager,连接到多个数据库,即transaction type=“JTA​​",jakarta-ee,eclipselink,ejb-3.0,entitymanager,jpa-2.1,Jakarta Ee,Eclipselink,Ejb 3.0,Entitymanager,Jpa 2.1,我在不同的服务器上分配了几个具有相同结构的数据库,每个客户都有一个数据库,我的应用程序需要动态连接到所有这些数据库 使用JTA。因此,当客户X执行某些数据库操作时,应用程序必须在运行时决定应该连接哪个数据库,并且该操作只应该在这个特定的数据库上执行。还有一个问题,我必须为我的每个客户创建一个连接池,如果其中一个客户连接失败,glassfish甚至都不会开始 我到处都找过了,但找不到好的解决方案。有人能帮我吗?我正在使用EJB3和JPA2与EclipseLink 如果我在运行时更改Persiste

我在不同的服务器上分配了几个具有相同结构的数据库,每个客户都有一个数据库,我的应用程序需要动态连接到所有这些数据库 使用JTA。因此,当客户X执行某些数据库操作时,应用程序必须在运行时决定应该连接哪个数据库,并且该操作只应该在这个特定的数据库上执行。还有一个问题,我必须为我的每个客户创建一个连接池,如果其中一个客户连接失败,glassfish甚至都不会开始

我到处都找过了,但找不到好的解决方案。有人能帮我吗?我正在使用EJB3和JPA2与EclipseLink


如果我在运行时更改PersistenceContext注释的unitName值,它可能会起作用,有人知道是否可以这样做吗?

我认为不可能在一个EntityManager中加载多个数据库实例。如果要插入一个实体,它应该怎么做?在所有实体中插入它?如果发现两个,会发生什么在两个不同的数据库中使用相同id的不同用户

您可以为每个数据库实例加载n个默认EntityManager,然后实现您自己的EntityManager,该EntityManager应该将工作委托给默认的EntityManager


如果您使用的是Java EE 6+,您可以使用CDI注入自定义构建的EntityManager;只需将其设置为EJB,用@Stateless注释它,然后将其注入到需要的位置,用@inject注释字段:

您需要的是一个多租户应用程序,其中每个租户都有自己的数据库。我相信您最好设计一个CDIt以便每个租户都有自己的persistenceUnit,如下所述


如果您选择此路线,则注入不可用,因为您需要控制用于为每个租户创建PersistenceUnits的属性。它允许您使用一个persistence.xml文件-然后您可以通过传入数据源以用于该租户,或者使用自定义程序根据租户来确定。参考资料租户只需要在EntityManager/EntityManagerFactory首次使用时存在,而不是在启动时,因此您可以动态添加租户,只要您可以为其配置和添加数据源。

您需要从应用程序中进一步充实您想要的内容。类似的数据库结构是否意味着您将使用相同的Java entity模型?当您尝试搜索实体时,JPA将查找哪些数据库?您希望如何控制写入哪些数据库?最简单的解决方案是创建多个持久化单元,每个持久化单元都有自己的数据源到自己的数据库。然后您将xa数据源绑定到服务器中的JTA。问题重写。@ChrisI不确定如果您的数据源无法连接,为什么Glassfish不会启动。在Glassfish中创建数据源的方法有很多,我假设Glassfish可以独立于其数据源启动。您是指在使用容器管理的持久化单元时,当数据源不可用时应用程序不工作吗?@lucianovcnt重写/重写/重写