1

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

我到处寻找,但找不到一个好的解决方案。有人可以帮我吗?我将 EJB 3 和 JPA2 与 EclipseLink 一起使用。

如果我在运行时更改 PersistenceContext 注释的 unitName 值,它可以工作,有谁知道是否可以这样做?

4

2 回答 2

0

我认为不可能在一个EntityManager. 如果要插入实体应该怎么做?全部插入?如果您在两个不同的数据库中找到两个不同的用户但具有相同的 id 会发生什么?

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

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

于 2014-09-17T18:47:21.327 回答
0

您需要的是一个多租户应用程序,其中每个租户都有自己的数据库。我相信你最好设计它,以便每个租户都有自己的 persistenceUnit,如此处所述http://wiki.eclipse.org/EclipseLink/Examples/JPA/Multitenant

如果你走这条路,注入是不可用的,因为你需要控制用于为每个租户创建 PersistenceUnits 的属性。它确实允许您使用一个 persistence.xml 文件 - 然后您可以通过http://www.eclipse.org/eclipselink/api/2.5/org/eclipse/persistence/config/传入数据源以供该租户使用EntityManagerProperties.html#JTA_DATASOURCE或使用定制器根据租户确定它。租户的资源只需要在第一次使用EntityManager/EntityManagerFactory时就存在,而不是在启动时存在,所以只要可以为其配置和添加数据源,就可以动态添加租户。

于 2014-09-18T16:45:56.823 回答