Java 如何在Felix中使用Derby客户端?
我想从OSGi包中运行Derby客户端。该捆绑包由Maven构建,因此我向Java 如何在Felix中使用Derby客户端?,java,maven,osgi,derby,apache-felix,Java,Maven,Osgi,Derby,Apache Felix,我想从OSGi包中运行Derby客户端。该捆绑包由Maven构建,因此我向org.apache.derby:derbyclient添加了一个依赖项。在运行时,我得到以下异常:java.sql.SQLException:找不到适合jdbc的驱动程序:derby://localhost:1527/testdb 有趣的是,当我使用嵌入式驱动程序和对org.apache.derby.derby的依赖关系时,整个过程都能正常工作。我只是看不出这两者之间有什么区别 我做错了什么?我如何修复它? 一些花絮:
org.apache.derby:derbyclient
添加了一个依赖项。在运行时,我得到以下异常:java.sql.SQLException:找不到适合jdbc的驱动程序:derby://localhost:1527/testdb
有趣的是,当我使用嵌入式驱动程序和对org.apache.derby.derby
的依赖关系时,整个过程都能正常工作。我只是看不出这两者之间有什么区别
我做错了什么?我如何修复它?
一些花絮:
DynamicImport包:
。这修复了嵌入式驱动程序的问题,但客户端仍然失败好吧,虽然我问这个问题还不到半个小时,但我找到了解决办法。我不知道它有多干净,但它似乎完成了工作:
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来获取连接。更好的方法是使用数据源 因此,对于derby客户端,您可以使用:
ClientDataSource ds = new ClientDataSource();
... // set properties here
Connection connection = dataSource.getConnection();
由于数据源方法不需要处理类加载器,因此在OSGi中更加可靠
此外,将数据源与客户机代码分离并将其绑定为OSGi服务是一种很好的做法。这允许在代码中保留对数据库impl的依赖关系
最简单的方法是使用并让它从配置中为您创建数据源。在您自己的代码中,您只需将数据源绑定为服务即可
pax jdbc的当前发布版本还不支持derbyclient,但我只是将其添加到主版本中。因此下一个版本应该包含它。嵌入式驱动程序和ClientDriver之间的区别可能是嵌入式驱动程序由JDK自动加载,而对于客户端驱动程序,您必须显式调用Class.forName。不管怎样,很高兴你成功了@布莱恩:问题是:如果没有类加载器的支持,即使是
Class.forName()
客户端驱动程序也会失败。我仍然不知道为什么有时需要,有时不需要。谢谢你的回答。不幸的是,自从提出这个问题以来,我已经更换了公司和技术,所以我不能再尝试了。您应该避免使用DynamicImport包:*以及设置上下文类加载器。这种方法以后可能会导致许多问题。这主要是作为最后手段。您应该尝试数据源方法,它是一个干净的解决方案,可以避免对OSGi类加载的干扰。