代码之家  ›  专栏  ›  技术社区  ›  James McMahon

如何在osgi环境中使jdbc驱动程序可插入?

  •  0
  • James McMahon  · 技术社区  · 15 年前

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

    现在,模型包需要能够看到JDBC驱动程序,我认为,这是因为EclipseLink使用模型类的类加载器来加载它。这有一个不必要的副作用,我需要显式声明 Import-Package 模型捆绑包中的指令以拉入驱动程序。然后,通过osgi交换驱动程序就不再容易了(我需要重新生成manifest),这从一开始就违背了使用osgi的目的。

    由于JDBC驱动程序都实现同一个接口,我想做的是将数据库驱动程序放在它们自己的包中,在它们的公共接口名下向OSGi容器注册它们,并让EclipseLink使用所有可用的接口。但我看不出该怎么做,因为驱动程序似乎是由EclipseLink实例化的,这意味着我不能在其他地方安装它,并让EclipseLink忽略实际的类名。

    这似乎是一件很典型的事情。我想已经有解决办法了吧?

    This post 甲骨文(oracle)的肖恩史密斯(shaun smith)今年早些时候表示,可能没有,但这也表明,对它的需求似乎相当真实。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Aaron Digulla    15 年前

    听起来像是日食线的缺点。我建议为此提交一个bug/feature请求。

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

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

    另一个解决方案可能是编写自己的jdbc驱动程序,它只是包装真正的驱动程序。在您的代码中,您可以使用osgi discovery来查找哪些真正的驱动程序可用,而eclipseline似乎没有任何变化。