【问题标题】:How can I make JDBC drivers pluggable in an OSGi environment?如何使 JDBC 驱动程序可插入 OSGi 环境?
【发布时间】:2010-12-06 06:05:53
【问题描述】:

我有一个 OSGi 项目,其中包含一个带有 JPA 注释域模型的包和另一个使用 Eclipselink 作为持久性提供程序的包。后者使用配置参数实例化EntityManager 以确定JDBC 驱动程序的类名。

现在,包含模型的捆绑包需要能够看到 JDBC 驱动程序,我认为这是因为 eclipselink 使用模型类的类加载器来加载它。这有不想要的副作用,我需要在模型包中显式声明 Import-Package 指令以拉入驱动程序。通过 OSGi 更换驱动程序不再容易(我需要重新生成清单),这首先违背了使用 OSGi 的目的。

由于 JDBC 驱动程序都实现了相同的接口,我想做的是将数据库驱动程序放在它们自己的包中,将它们注册到 OSGi 容器中,使用它们的通用接口名称,并让 eclipselink 使用任何可用的东西。但我不知道该怎么做,因为似乎驱动程序是由 eclipselink 实例化的,这意味着我无法在其他地方实例化它并且让 eclipselink 忘记实际的类名。

这似乎是一件非常典型的事情。我想已经有解决方案了?

Oracle 的 Shaun Smith 今年早些时候提出的This post 暗示可能没有,但这也表明对它的需求似乎相当真实。

【问题讨论】:

    标签: jdbc osgi eclipselink


    【解决方案1】:

    听起来像是eclipselink的一个缺点。我建议为此提交错误/功能请求。

    解决您的问题的方法是将另一个包引入从您的模型和 JDBC 驱动程序包导入的图片中,然后将 eclipselink 指向该新包。

    这意味着您的模型没有对 JDBC 内容的任何引用,您可以在一个新包中建立连接。缺点是每个受支持的 JDBC 驱动程序都需要一个这样的包,但这些包几乎是样板代码,所以在几分钟内创建另一个应该很简单。

    另一种解决方案可能是编写您自己的 JDBC 驱动程序,该驱动程序简单地包装了真正的驱动程序。在您的代码中,您可以使用 OSGi 发现来查找可用的真实驱动程序,而 eclipselink 似乎没有任何变化。

    【讨论】:

      猜你喜欢
      • 2011-06-16
      • 2011-06-23
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多