Как использовать Derby Client в Феликсе? - PullRequest
3 голосов
/ 11 апреля 2011

Я хочу запустить Derby Client из пакета OSGi.Пакет создается Maven, поэтому я добавил зависимость к org.apache.derby:derbyclient.Во время выполнения я получаю следующее исключение: java.sql.SQLException: No suitable driver found for jdbc:derby://localhost:1527/testdb.

Интересно, что все работает, когда я использую встроенный драйвер и зависимость от org.apache.derby.derby.Я просто не вижу разницы между этими двумя.

Что я делаю не так и как я могу это исправить?

Некоторые лакомые кусочки:

  1. После некоторых советов, которые я нашел в Интернете, я установил следующий заголовок OSGi: DynamicImport-Package: *.Это исправило проблемы со встроенным драйвером, но клиент по-прежнему не работает.
  2. Используемая версия Derby - 10.7.1.1, в которой должна быть включена поддержка OSGi (по крайней мере, она имеет заголовки OSGi).

Ответы [ 2 ]

2 голосов
/ 04 февраля 2015

В OSGi рекомендуется не использовать DrivverManager для получения соединения.Лучше всего использовать DataSource.

Так что для клиента Derby вы можете использовать это:

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

Поскольку подход DataSource не возиться с загрузчиком классов, он намного надежнее в OSGi.

Кроме того, рекомендуется отделить DataSource от вашего клиентского кода и связать его как службу OSGi.Это позволяет сохранить зависимость от базы данных в вашем коде.

Самый простой подход - использовать pax-jdbc-config и позволить ему создать источник данных для вас из конфигурации.В вашем собственном коде вы просто связываете DataSource как сервис, и все в порядке.

Текущая версия pax-jdbc пока не поддерживает derbyclient, но я только добавил это к мастеру.Поэтому следующий выпуск должен содержать его.

2 голосов
/ 11 апреля 2011

Хорошо, хотя даже полчаса не прошло с тех пор, как я задал вопрос, я нашел решение.Я не знаю, насколько она чиста, но, кажется, она справилась с работой:

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);
}
...