Apache Felix не может получить доступ к Postgres JDBC

Я загрузил Postgresql-9.2-1003.jdbc3.jar и поместил его в каталог felix \ bundle.

Моя программа обращается к таблице EMP Postgres и распечатывает ее. Я пытаюсь сделать это на сервере Felix OSGi. Моя программа состоит из двух частей:

  1. Программа части 1, которая просто подключается к драйверу Postgres JDBC и открывает базу данных:

    пакет com.myprogram.myemp;

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import org.postgresql.Driver;

    public class ConnectPostgres {

    static final String DB_URL = "jdbc:postgresql://localhost:5432/scott";
    static final String UNAME = "postgres";
    static final String PWORD = "password";
    
    
    public void myMain() {
        Connection conn = null;
        ResultSet rs = null;
        Statement st = null;
        String JDBC_DRIVER = Driver.class.getName();
    
        try {
            Class.forName(JDBC_DRIVER);
            conn = DriverManager.getConnection(DB_URL, UNAME, PWORD);
            st = conn.createStatement();
            rs = st.executeQuery("select * from EMP");
            while (rs.next()) {
                System.out.println ("EMP Name:" + rs.getLong("EMPNO") + " " + rs.getString("ENAME") );
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
                st.close();
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    }

  2. Программа Part-2 больше похожа на запуск пакета в качестве поставщика услуг:

    пакет com.myprogram.myemp;

    import org.osgi.framework.BundleContext; import org.osgi.framework.BundleActivator;

    Открытый класс Activator реализует BundleActivator {

    @Override
    public void start(BundleContext arg0) throws Exception {
        ConnectPostgres app = new ConnectPostgres();
        app.myMain();
    }
    
    @Override
    public void stop(BundleContext arg0) throws Exception {
    }
    

    }

Требование: Используя соединение с базой данных популярной базы данных, такой как Postgres или SQLite, я должен иметь возможность опубликовать таблицу EMP как службу на OSGi-совместимом сервере Felix, Equinox.

** Ошибка, которую я получаю в Felix 3.0:

Неудовлетворенные требования:

(& (пакет = org.postgresql)) **

Драйвер есть, я поместил его в каталог пакетов.

Проблема как мне кажется:

  1. Подключения к базе данных с использованием JDBC невозможны в OSGi. Может ли OSGi подключаться к базам данных? Спецификация, вики, примеры, похоже, ничего не говорят. Без этого все примеры выглядят как программы преобразования температуры из градуса Цельсия в градусы Фаренгейта, не представляющие реальной ценности для бизнеса. Пожалуйста, поправьте меня, если я неправильно понимаю OSGi.

  2. Что я делаю не так? Каким другим способом я должен попытаться подключиться к базе данных.

заранее спасибо


person Relational and Re-engineering    schedule 16.07.2013    source источник
comment
Почему вы считаете, что просто поместить драйвер JAR в каталог bundle достаточно для установки этого драйвера в инфраструктуру OSGi ??   -  person Neil Bartlett    schedule 16.07.2013
comment
Что касается первого вопроса ... из конечно OSGi может подключаться к базам данных. Это не указывается явно, потому что это не обязательно. Скорее, не думаете ли вы, что это будет явно указано, если OSGi не сможет подключиться к базам данных?   -  person Neil Bartlett    schedule 16.07.2013
comment
+1 для Нила, хотя кажется интуитивно понятным поместить JAR в каталог пакетов и ожидать, что он станет пакетом. Не уверен на 100% в их настройке, но это могло быть так, если бы драйверы postgresql не были готовы к OSGI.   -  person Sheena Artrip    schedule 16.07.2013
comment
Другой момент ... вопрос говорит, что вы используете Felix 3.0. Он очень старый, и вам следует по возможности обновить его до Felix 4.2 (хотя это не решит эту конкретную проблему).   -  person Neil Bartlett    schedule 16.07.2013


Ответы (2)


Postgresql-9.2-1003.jdbc3.jar JAR, вероятно, не является пакетом OSGI, поэтому вы не можете просто установить его так, как вы это сделали.

Проверить здесь:

https://ops4j1.jira.com/wiki/display/PAXJDBC/PostgreSQL+Driver+Adapter

Официальный артефакт Maven postgresql: postgresql - это простой старый JAR без заголовков манифеста OSGi. Вам нужно будет обернуть это на лету, используя Pax URL wrap: handler, или создать свой собственный пакет, добавив манифест OSGi. Этот пробел должен восполнить проект «Пакс Типи».

person Sheena Artrip    schedule 16.07.2013
comment
Шина: Спасибо за ссылку. Но я использовал другую ссылку: cq-ops.tumblr.com/post/21893960212/. Это было очень полезно. Пошаговая инструкция по преобразованию драйвера jdbc в пакет osgi. Пакет был принят Felix 4.2, и моя программа на нем была запущена. Но результаты - совсем другое дело. А пока спасибо. - person Relational and Re-engineering; 18.07.2013
comment
Нет проблем, я рад, что вы опубликовали свое решение =) - person Sheena Artrip; 18.07.2013

Новейшая версия postgresql (9.4-1201- jdbc41) уже является пакетом OSGi.

Пакеты Servicemix теперь содержат связанную версию драйвера postgres. Итак, вы можете найти драйвер jdbc postgres в центральном репозитории maven.

person Christian Schneider    schedule 19.02.2014
comment
Кристиан, поскольку версии постоянно обновляются, и я не предполагаю, что все они OSGi, безопасно ли проверять состояние готовности OSGi, открыв файл манифеста в последней версии, а затем ища необходимые записи? Есть ли другой способ определить, готова ли она к OSgi? - person Namphibian; 18.11.2016