我想在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
的依赖时,整个过程都有效。我只是没有看到这两者之间的区别。
我做错了什么以及如何解决?
一些花絮:
DynamicImport-Package: *
。这解决了嵌入式驱动程序的问题,但客户端仍然失败。答案 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中。所以下一个版本应该包含它。