如何在Felix中使用Derby Client?

时间:2011-04-11 09:27:59

标签: java maven osgi derby apache-felix

我想在OSGi包中运行Derby Client。该包由Maven构建,因此我向org.apache.derby:derbyclient添加了一个依赖项。在运行时,我得到以下异常:java.sql.SQLException: No suitable driver found for jdbc:derby://localhost:1527/testdb

有趣的是,当我使用嵌入式驱动程序和对org.apache.derby.derby的依赖时,整个过程都有效。我只是没有看到这两者之间的区别。

我做错了什么以及如何解决?

一些花絮:

  1. 在互联网上找到一些建议后,我设置了以下OSGi标题:DynamicImport-Package: *。这解决了嵌入式驱动程序的问题,但客户端仍然失败。
  2. 我使用的Derby版本是10.7.1.1,应该启用OSGi(至少它有OSGi头)。

2 个答案:

答案 0 :(得分:2)

好吧,虽然自从我提出问题以来我已经找到了一个解决方案,但是甚至还没过半个小时。我不知道它有多干净,但它似乎完成了工作:

ClassLoader ctxtCl = Thread.currentThread().getContextClassLoader();
try {
    Thread.currentThread().setContextClassLoader(getClass().getClassLoader());

    try {
        Class.forName("org.apache.derby.jdbc.ClientDriver");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    dbConnection = DriverManager.getConnection("jdbc:derby://localhost:1527/testdb");
} catch (SQLException e) {
    /* log, etc. */
} finally {
    Thread.currentThread().setContextClassLoader(ctxtCl);
}

答案 1 :(得分:2)

在OSGi中,建议不要使用DrivverManager来建立连接。更好的方法是使用DataSource。

因此对于德比客户端,你可以使用它:

ClientDataSource ds = new ClientDataSource();
... // set properties here
Connection connection = dataSource.getConnection();

由于DataSource方法没有使用类加载器,因此它在OSGi中更加可靠。

此外,将DataSource与客户端代码分离并将其绑定为OSGi服务是一种很好的做法。这样可以保持对数据库的依赖性从代码中消失。

最简单的方法是使用pax-jdbc-config并让它从配置中为您创建DataSource。在您自己的代码中,您只需将DataSource绑定为服务即可。

当前发布的pax-jdbc版本尚不支持derbyclient,但我刚将其添加到master中。所以下一个版本应该包含它。