2

OSGi バンドルで Apache commons-dbcp 接続プールを使用しているコードをいくつか継承しました。このコードは、Eclipse/Equinox OSGi バージョン 3.4.3 (R34x_v20081215)、commons-dbcp 1.2.2、および springsource.org の postgres jdbc3 8.3.603 バンドルで正常に動作します。

私はモダナイズしたかったのですが、これが私の最初の間違いだったのかもしれません!

最新バージョンの commons-dbcp (1.4.1) とともに、新しい postgresql JDBC3 または JDBC4 バンドルで Felix または Equinox OSGI コアの新しいバージョンを使用すると、クラスローディングの問題が発生します。多数の検索を行ったところ、commons-dbcp コードには修正DBCP-214が必要であることがわかりましたが、それでも失敗しているようです。

commons-dbcp MANIFEST.MF import-package 行に org.postgresql を配置しようとしましたが、それも機能しませんでした。

最初に基本的な class.forName() と DriverManager.getConnection() を実行するアクティベーターで簡単なテストを作成しましたが、これは正常に動作しますが、BasicDataSource() を追加して BasicDataSource.getConnection() との接続をセットアップすると、 ClassNotFoundException。以下のコード例を参照してください。

ヘルプ、提案などをお寄せいただきありがとうございます...

さう!

// This one fails with an exception
public void dsTest() {
    BasicDataSource bds = new BasicDataSource();
    ClassLoader cl;

    try {
        logger.debug("ContextClassLoader: {}", 
        Thread.currentThread().getContextClassLoader().toString());
        cl = this.getClass().getClassLoader();
        logger.debug("ClassLoader: {}", cl); 

        if (bds.getDriverClassLoader() != null) {
            logger.debug(bds.getDriverClassLoader().toString());
        }
        // The failure is the same with and with the setDriverClassLoader() line
        bds.setDriverClassLoader(cl);
        bds.setDriverClassName("org.postgresql.Driver");
        bds.setUrl("jdbc:postgresql://127.0.0.1/dbname");
        bds.setUsername("user");
        bds.setPassword("pword");
        Class.forName("org.postgresql.Driver").newInstance();
        conn = bds.getConnection();
        Statement st = conn.createStatement();
        ResultSet rs = st.executeQuery("SELECT COUNT(*) FROM table");
        conn.close();
        logger.debug("Closed DataSource Test");
    } catch (Exception ex) {
        ex.printStackTrace();
        logger.debug("Exception: {} ", ex.getMessage());
    }
}

// This one works
public void managerTest() {
    ClassLoader cl;
    try {
        cl = this.getClass().getClassLoader();
        logger.debug("ClassLoader: {}", cl);
        Class.forName("org.postgresql.Driver").newInstance();
        String url = "jdbc:postgresql://127.0.0.1/dbname";
        conn = DriverManager.getConnection(url, "user", "pword");

        Statement st = conn.createStatement();
        ResultSet rs = st.executeQuery("SELECT COUNT(*) FROM table");
        conn.close();
        logger.debug("Closed Manger Test");
    } catch (Exception ex) {
        ex.printStackTrace();
        logger.debug("Exception: {} ", ex.getMessage());
    }
}
4

1 に答える 1

3

これは、osgiクラスローダーが原因で、commons-dbcpバンドルが実際のドライバークラスを確認できないためです。これに対する解決策は、DynamicImport*を使用してcommons-dbcpクラスにフラグメントをアタッチすることです。マニフェストに必要な実際のヘッダーは次のとおりです。

フラグメント-ホスト:org.apache.commons.dbcp DynamicImport-パッケージ:*

この後、あなたが言及したコードは機能しました。これが遅すぎないことを願っています。

于 2010-10-26T22:55:24.157 に答える