3

私の OSGi 環境では、さらに使用するためにデータベース ドライバーをプリロードしようとしています。通常、これは次のように実行できます。

Class.forName("com.mysql.jdbc.Driver");

その後、接続を作成できます。ただし、Felix の下の OSGi でそれを使用すると、クラスが見つからず ( ClassNotFoundException)、接続を作成できないと彼は言います。しかし、私がそのようなことをすると(try-catchは省略されます):

com.mysql.jdbc.Driver d = new com.mysql.jdbcDriver
Class.forName("com.mysql.jdbc.Driver");

その後、すべてが正常に機能し、接続が作成されます。ただし、ドライバー クラスを交換できないため、これはあまりきれいではありません。

最初のメソッドでクラスをロードする方法はありますか? 正しいクラスローダーを提供する必要があると思います。しかし、どこからそれを入手できますか?

MySQL ドライバーは、OSGi ラッパー バンドルとして提供されます。

4

2 に答える 2

4

バンドルマニフェストをどの程度正確に作成しますか?ツールを使用してバンドルのOSGiインポートステートメントを自動的に解決する場合、ツールは単純な文字列をパッケージの依存関係として認識しないため、最初のメソッドで失敗します。2番目の方法は、依存関係をハードJava依存関係として表現するため、必要なOSGiインポートステートメントを追加するツールによって認識されます(したがって、OSGiランタイムによってバンドルのクラスパスに認識されます)。

したがって、最初のメソッドが機能するには、パッケージcom.mysql.jdbcへの依存関係をバンドルのOSGiインポートステートメントに追加する必要があります。これがどのように達成されるかはツール固有であり、BndはImport-Statement構成パラメーターを使用します。

于 2012-03-05T21:12:32.217 に答える
3

彼の答えで@Heriが言ったことはすべて正しかった。ただし、このシステムにより柔軟性を持たせたい場合は、OSGi Services を使用してください。

データベース接続を確立したいが、コードを特定のデータベースまたは JDBC ドライバーに密結合したくない場合。javax.sql.DataSourceサービスを公開する小さな JDBC ラッパー バンドルを作成してみませんか? ロジック バンドルは、データベースにクエリを実行したいときにサービスにバインドでき、物理的なデータベース接続について何も知る必要はありません。

JDBC ラッパー バンドルは特定の JDBC ドライバーについて知る必要があることに注意してください。ただし、これは非常に薄いバンドルであり、使用するドライバーごとに代替ラッパーを作成できます。

于 2012-03-06T00:58:19.187 に答える