Проблема с загрузкой классов OSGI и Apache Commons-DBCP

Я унаследовал некоторый код, который использует пулы соединений Apache commons-dbcp в комплекте OSGi. Этот код отлично работает с Eclipse/Equinox OSGi версии 3.4.3 (R34x_v20081215), commons-dbcp 1.2.2 и пакетами postgres jdbc3 8.3.603 с сайта springsource.org.

Хотел модернизировать, тк это была моя первая ошибка!

Когда я использую новую версию Felix или Equinox OSGI Cores с новыми пакетами postgresql JDBC3 или JDBC4 вместе с последней версией commons-dbcp (1.4.1), у меня возникает проблема с загрузкой классов. Я выполнил многочисленные поиски и обнаружил, что в коде commons-dbcp должно быть исправление DBCP-214., но все еще кажется, что это не удается.

Я попытался поместить org.postgresql в строку импорта пакета commons-dbcp MANIFEST.MF, но это тоже не сработало.

Я написал простой тест в активаторе, который сначала выполняет базовый 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());
    }
}

person Community    schedule 23.03.2010    source источник


Ответы (1)


это связано с тем, что пакет commons-dbcp не может просматривать фактический класс драйвера из-за загрузчика классов osgi. Решением этого является присоединение фрагмента к классу commons-dbcp с помощью Dynamic Import *. Фактические заголовки, которые вам нужны в вашем МАНИФЕТЕ, следующие:

Хост-фрагмент: org.apache.commons.dbcp DynamicImport-Package: *

После этого код, который вы упомянули, заработал. Надеюсь, это не слишком поздно.

person maquina    schedule 26.10.2010