3

OSGiバンドル内からDerbyクライアントを実行したい。バンドルはMavenによってビルドされるため、に依存関係を追加しましたorg.apache.derby:derbyclient。実行時に、次の例外が発生しますjava.sql.SQLException: No suitable driver found for jdbc:derby://localhost:1527/testdb

興味深いことに、組み込みドライバーとへの依存関係を使用すると、すべてが機能しorg.apache.derby.derbyます。この2つの違いはわかりません。

何が間違っているので、どうすれば修正できますか?

いくつかのヒント:

  1. インターネットで見つけたアドバイスの後、次のOSGiヘッダーを設定しましたDynamicImport-Package: *。これにより、組み込みドライバーの問題は修正されましたが、クライアントは引き続き失敗します。
  2. 私が使用しているDerbyのバージョンは10.7.1.1であり、OSGiが有効になっている必要があります(少なくともOSGiヘッダーがあります)。
4

2 に答える 2

2

さて、私が質問をしてから30分も経っていませんが、解決策を見つけました。私はそれがどれほどきれいかわかりませんが、それは仕事を成し遂げたようです:

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 に答える
2

OSGiでは、接続を取得するためにDrivverManagerを使用しないことをお勧めします。より良い方法は、データソースを使用することです。

したがって、ダービークライアントの場合、これを使用できます。

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

DataSourceアプローチはクラスローダーをいじらないので、OSGiでははるかに信頼性があります。

さらに、データソースをクライアントコードから分離し、OSGiサービスとしてバインドすることをお勧めします。これにより、データベースimplへの依存関係をコードから除外できます。

最も簡単なアプローチは、pax-jdbc-configを使用して、構成からデータソースを作成することです。独自のコードでは、データソースをサービスとしてバインドするだけで問題ありません。

現在のリリースバージョンのpax-jdbcはまだderbyclientをサポートしていませんが、これをマスターに追加しただけです。したがって、次のリリースにはそれが含まれているはずです。

于 2015-02-04T10:32:07.190 に答える