2011-04-11 5 views
3

OSGiバンドルからDerby Clientを実行します。バンドルはMavenによって構築されるので、org.apache.derby:derbyclientに依存関係を追加しました。実行時に、私は次の例外を受け取ります:java.sql.SQLException: No suitable driver found for jdbc:derby://localhost:1527/testdbDerby ClientをFelixで使用するには?

埋め込みドライバと依存関係を使用すると面白いことに、が動作します。私はちょうどそれらの2つの違いを見ていない。

私は間違っていますが、どうすれば修正できますか?

いくつかの一口:DynamicImport-Package: *

  1. いくつかのアドバイスの後、私は次のOSGiヘッダーを設定し、インターネット上で見つけました。組み込みドライバのこの固定された問題は依然として失敗します。
  2. 私が使用するDerbyのバージョンは10.7.1.1です。OSGiを有効にする必要があります(少なくともOSGiヘッダーがあります)。
+0

EmbeddedDriverとClientDriverの違いは、組み込みドライバがJDKによって自動ロードされることですが、クライアントドライバではClass.forNameを明示的に呼び出す必要がある可能性があります。とにかく、うれしく働いてくれた! –

+0

@ブライアン:物事は:そのクラスローダーなしでは、 'Class.forName()'でもクライアントドライバで失敗します。なぜそれが時には必要なのか、時には理解できないのかまだ分かりません。 – musiKk

答えて

2

わかりましたが、私は解決策を見つけたので質問してから30分経っていません。私はそれがどのようにきれいに知りませんが、それは仕事を得るようだ:

の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); 
} 
1

それは接続を取得するためにDrivverManagerを使用しないことをお勧めします。より良い方法は、データソースを使用することです。データソースのアプローチはそれがはるかに信頼できるOSGiのであるクラスローダをいじるないため

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

だから、ダービーのクライアントのためにあなたはこれを使用することができます。

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

最も簡単な方法は、pax-jdbc-configを使用して、設定からDataSourceを作成させることです。あなたのコードでは、DataSourceをサービスとしてバインドしても問題ありません。

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

+0

あなたの答えをありがとう。残念ながら私は企業や技術を切り替えた後、私はもうそれを試すことはできません。 – musiKk

関連する問題