【问题标题】:OSGi ClassNotFoundException while loading Database Driver加载数据库驱动程序时出现 OSGi ClassNotFoundException
【发布时间】:2017-05-31 11:29:09
【问题描述】:

我知道这是一个常见问题,但是创建一个新线程以防万一有人像我一样在尝试了文档中已经解释的一些选项后仍然卡住了。

我已经部署了一个 osgi 包(比如包 B),其中包含与数据层访问相关的所有代码。基本上,当访问此捆绑包中的服务方法时,它仅在第一次通过加载驱动程序时创建 JDBC 连接。驱动程序被部署为另一个包装好的 sqljdbc 4.0 包。 (说 C 包)

现在我有 Bundle TestApp(比如 Bundle A),它从 Bundle B 中创建上述服务方法的实例。所以这里的流程是 Bundle A 代码创建 Bundle B 的导出服务的实例,然后访问 Bundle C 的 Driver 类.

Caused by: java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver not found by DataServices [417]
        at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1556)
        at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:77)
        at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1993)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:264)

单个类加载器在这里提出问题,但如何克服是我这里的情况。我尝试将 DynamicImport-Package 添加到捆绑包 A、B,尝试创建一个片段捆绑包,如此处 https://gist.github.com/rotty3000/1291842 所述,但仍然是相同的例外。继续。

如果有人遇到这样的问题,如果你能给我一个逐步解决这个问题的方法,那将是一个很大的帮助。

提前谢谢大家,祝大家新年快乐。

【问题讨论】:

  • 你的包中有什么代码(只显示相关行)。在异常发生时它会做什么?
  • 来自 Bundle A,PremiumService 服务 = new PremiumServiceImpl();来自 Bundle B PremiumServiceImpl,dao.getJdbcConnection(),依次调用 Class.forName(),来自 Bundle C,sqljdbc4-4.jar,它是一个包装好的 bundle
  • 当我在 Class.forName(driverClassName) 这一行调试应用程序时,类加载器是捆绑类加载器,捆绑包作为捆绑包 A 的名称,而这行代码位于捆绑包 B (DataServices)项目。驱动程序类名称值也被确认为正确。

标签: osgi osgi-bundle jbossfuse karaf blueprint-osgi


【解决方案1】:

Driver 方法在 OSGi 中效果不佳。而是使用数据源。 见example at msdn。您可以简单地使用 new 创建一个数据源。这样可以避免任何类加载问题。

如果您想与实际的 DB 提供者分离,那么您可以使用 OSGi jdbc 规范,该规范定义了 db 提供者应该公开一个可以为您创建 DataSource 的 DataSourceFactory。

Pax-jdbc 支持该规范用于大量数据库提供程序。它允许有一个pax-jdbc-config 模块,该模块允许仅使用配置创建一个 DataSource 作为 OSGi 服务。因此,在您的代码中,您只需注入服务即可完成。此外,pax-jdbc-config 还可以处理池化并使 DataSource XA 感知。因此,它会生成一个完全可用于生产的数据源。

【讨论】:

  • 谢谢克里斯蒂安,让我试试这个选项。
  • Pax-jdbc,我看到了广泛的 DB 支持,但看不到 SQLServer。这是我们必须使用 Generic Driver Extender 的地方吗?
  • 有一个mssql模块。 github.com/ops4j/org.ops4j.pax.jdbc/tree/master/pax-jdbc-mssql 。它是自 0.6.0 以来发布的一部分
  • 非常感谢克里斯蒂安。 msdn 的示例对我有用。但我也想尝试 pax-jdbc 选项。当我有时间时会尝试一下,因为它具有池和 XA 等优点
猜你喜欢
  • 1970-01-01
  • 2013-03-03
  • 1970-01-01
  • 2013-06-13
  • 2016-03-01
  • 2011-04-26
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
相关资源
最近更新 更多