Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Felix中使用Derby客户端?_Java_Maven_Osgi_Derby_Apache Felix - Fatal编程技术网

Java 如何在Felix中使用Derby客户端?

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的依赖关系时,整个过程都能正常工作。我只是看不出这两者之间有什么区别 我做错了什么?我如何修复它? 一些花絮:

我想从OSGi包中运行Derby客户端。该捆绑包由Maven构建,因此我向
org.apache.derby:derbyclient
添加了一个依赖项。在运行时,我得到以下异常:
java.sql.SQLException:找不到适合jdbc的驱动程序:derby://localhost:1527/testdb

有趣的是,当我使用嵌入式驱动程序和对
org.apache.derby.derby
的依赖关系时,整个过程都能正常工作。我只是看不出这两者之间有什么区别

我做错了什么?我如何修复它?

一些花絮:

  • 在互联网上找到一些建议后,我设置了以下OSGi头:
    DynamicImport包:
    。这修复了嵌入式驱动程序的问题,但客户端仍然失败
  • 我使用的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来获取连接。更好的方法是使用数据源

    因此,对于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类加载的干扰。