【问题标题】:Dynamicly select datasource for entities runtime为实体运行时动态选择数据源
【发布时间】:2010-06-10 14:33:01
【问题描述】:

我有一个实体 bean,它将代表多个数据库/数据源的预期结果,也可以是执行的不同查询,但总是返回相同的结果。因此 bean 可以在应该能够动态选择的不同数据源上重复使用。

JPA 是否可以在运行时选择用于执行查询的数据源,并返回相同类型的实体 bean? 另外,我的 ejb/应用程序是否需要定义将要使用的数据源?或者我总是可以通过 jndi 指定要使用的数据源吗?每次创建新数据源时都不能修改描述符并重新部署应用程序。

对不起,如果这个问题没有 100% 有意义,很难理解这个想法。

【问题讨论】:

    标签: jpa ejb-3.0 weblogic jdeveloper


    【解决方案1】:

    JPA 是否可以在运行时选择用于执行查询的数据源,并返回相同类型的实体 bean?

    您不能在运行时更改持久性单元的数据源。但是,您可以配置多个持久性单元并使用一个或另一个EntityManagerFactory。也许 JPA 不是适合您的用例的工具。

    每次创建新数据源时都不能修改描述符并重新部署应用程序。

    应用程序如何知道“可用数据源”?

    【讨论】:

    • 谢谢,你是对的,JPA 在这里不是正确的工具。我希望情况并非如此。对于第二个问题,我的意思是 j2ee 容器将配置所有数据源,但应用程序本身不会。但是,如果我离开 JPA,这并不重要。谢谢。
    • 这是不正确的。您可以在运行时修改持久性单元的数据源。修改后,任何进一步创建的EntityManagerFactory 都将拥有新的数据源。请参阅my answer 了解如何操作。
    【解决方案2】:

    您可以在运行时更改 JPA 数据源,但这种方法很棘手(自省、特定于 JPA 实现,...)。

    我已经实现了自己的javax.persistence.spi.PersistenceProvider 实现,它覆盖了org.hibernate.ejb.HibernatePersistence,并在创建EntityManagerFactory 之前在PersistenceProviderMapPersistenceUnitInfo 中设置了数据源。这样,我的EntityManagerFactory 就有了一个在运行时配置的数据源。在取消部署应用程序之前,我会保留我的 EntityManagerFactory

    您可以使用相同的方法并创建 N 个不同的EntityManagerFactory,每个都有其特定的数据源。但是请记住,每个ÈntityManagerFactory 都会占用大量内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-31
      • 2013-12-07
      • 1970-01-01
      • 2015-07-17
      • 2012-01-16
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      相关资源
      最近更新 更多