如何在Felix中使用Derby Client?

我想从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
时,整个过程都有效。我只是没有看到这两者之间的区别。 我做错了什么,我该如何解决? 一些花絮: 在我在互联网上找到一些建议后,我设置了以下OSGi标题:
DynamicImport-Package: *
。这解决了嵌入式驱动程序的问题,但客户端仍然失败。 我使用的Derby版本是10.7.1.1,应该启用OSGi(至少它有OSGi头)。     
已邀请:
好吧,虽然自从我提出问题以来我已经找到一个解决方案,但是甚至还有半个小时过去了。我不知道它有多干净,但它似乎完成了工作:
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);
}
    
在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中。所以下一个版本应该包含它。     

要回复问题请先登录注册