【问题标题】:Using Hibernate/JPA with multiple ClassLoaders to access multiple databases使用带有多个 ClassLoader 的 Hibernate/JPA 访问多个数据库
【发布时间】:2019-12-16 08:00:18
【问题描述】:

我们的应用程序是一个中间层应用程序,它为十几个前端应用程序提供了对后端几十个数据库(和其他数据源)的访问权限。

我们决定使用 OSGi 将不相关的代码部分分成单独的包。这确保了正确的代码封装,甚至允许热交换特定的包。

这样做的一个好处是任何与特定数据库相关的代码都被隔离到一个单独的包中。它还允许我们为新目的地简单地放入一个新包,并无缝集成新代码。它还确保如果单个后端数据源关闭,对其他数据源的请求不受影响。一个复杂的问题是,这些捆绑软件中的每一个都由单独的 ClassLoader 加载。

我们想开始将 JPA 用于我们正在构建的新目的地。以前,我们一直使用 JDBC 直接发送 SQL 查询和更新。

我们已经研究过 Hibernate 4,但它似乎是建立在假设一切都使用单个 ClassLoader 加载的基础上的。在不同包的 ClassLoader 之间切换似乎不是它可以始终如一地处理的事情。

虽然 Hibernate 5 似乎已经纠正了这个问题,但我找到的所有教程/文档都掩盖了配置的复杂性。最简单的假设是您使用的是单个应用程序级配置文件,这根本不适合我们的需求。

所以,我的问题是:

  1. Hibernate 5 是否能正确处理连接到多个数据库,每个数据库的配置/POJos 由不同的 ClassLoader 加载?
  2. 我们如何配置 Hibernate 以使用多个 ClassLoader 连接到多个数据库?
  3. 是否有其他 JPA 框架可能更适合我们的特定需求?

【问题讨论】:

    标签: java hibernate jpa osgi classloader


    【解决方案1】:

    Hibernate 很好,但对于 OSGi 的使用,您还需要一个中介。在 OSGi 规范中,这是由 OSGi JPA service spec 定义的。它定义了如何在没有硬引用的情况下连接到 OSGi 中的 JPA 提供程序。

    此规范由Aries JPA 实施。它还为蓝图和declarative services 提供了额外的支持。还有Aries transaction control 服务采用类似的方法来支持 OSGi 中的 JPA 和事务,它也使用 Aries JPA 的核心,但在使用上有点不同。

    您可能需要的最后一部分是pax-jdbc,它允许仅通过配置定义 XA 数据源。示例已经使用它。

    要轻松上手,您可以使用Apache Karaf,它具有上述所有功能。

    Aries JPA 允许在同一个 OSGi 应用程序中使用不同的数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 2014-11-04
      • 1970-01-01
      • 1970-01-01
      • 2010-12-26
      • 2017-03-08
      • 1970-01-01
      相关资源
      最近更新 更多