3

我想从 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 标头)。
4

2 回答 2

2

在 OSGi 中,建议不要使用 DrivverManager 来获取连接。更好的方法是使用数据源。

所以对于德比客户,你可以使用这个:

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

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

此外,将 DataSource 与您的客户端代码分开并将其绑定为 OSGi 服务是一种很好的做法。这允许将对数据库 impl 的依赖保持在您的代码之外。

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

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

于 2015-02-04T10:32:07.190 回答
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);
}
于 2011-04-11T09:50:35.390 回答