Пул подключений для пакета OSGI - PullRequest
1 голос
/ 22 мая 2019

Я пытаюсь реализовать какую-то микросервисную архетектуру с использованием OSGI. У меня есть пакет UserDAO, который получает соединение из пула соединений в другой пакет (соединитель). Они связаны с сервисным API OSGI. Итак, вопросы:

1) Должен ли я зарегистрировать интерфейс (IConnector) в качестве службы или реализацию этого интерфейса (Connector):

 serviceRegistration = bundleContext.registerService(IConnector.class.getName(), new Connector(), null);

VS

serviceRegistration = bundleContext.registerService(Connector.class.getName(), new Connector(), null);

Оба эти варианта работают нормально. Если я регистрирую IConnector (интерфейс), я просто отслеживаю его:

userDBConnectorTracker = new ServiceTracker(context, IConnector.class.getName(), this);

Точно так же, если я регистрирую Connector (реализация IConnector):

userDBConnectorTracker = new ServiceTracker(context, Connector.class.getName(), this);

2) Я хочу использовать DBCP или HikariCP, но во всех примерах с ними используются статические методы без интерфейса, например:

public class HikariCPDataSource {

    private static HikariConfig config = new HikariConfig();
    private static HikariDataSource ds;

    static {
        config.setJdbcUrl("jdbc:h2:mem:test");
        config.setUsername("user");
        config.setPassword("password");
        config.addDataSourceProperty("cachePrepStmts", "true");
        config.addDataSourceProperty("prepStmtCacheSize", "250");
        config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
        ds = new HikariDataSource(config);
    }

    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }

    private HikariCPDataSource(){}
}

Я пробовал это. Но тогда мне нужно изменить метод моего интерфейса на статический, как методы реализации: enter image description here

Я не могу использовать это, потому что, если я зарегистрирую Interface моего класса Connector в качестве службы, это вызовет ошибку «статический метод в интерфейсе не разрешен».

enter image description here

Должен ли я просто удалить статические из всех методов в классе Connector? Почему каждый использует статический в пуле соединений?

1 Ответ

1 голос
/ 22 мая 2019

Для службы OSGi вы обычно должны использовать интерфейс, чтобы объявить об этом. Таким образом, пользователь сервиса не привязан к вашему классу реализации.

Использование статического метода для возврата соединения обычно является плохой идеей в OSGi. Вы захотите предоставить конфигурацию источника данных, используя конфигурацию OSGi. Эти конфигурации предоставляются во время выполнения и могут даже исчезнуть во время выполнения. Таким образом, вам нужно реализовать это таким образом, чтобы справиться с конфигурацией или изменением конфигурации.

Хорошей практикой является предоставление фабрики для подключения в качестве службы, как только администратор конфигурации предоставит вам конфигурацию, и удаление службы, когда конфигурация исчезнет.

Делать все это с простыми API OSGi очень громоздко. Старайтесь не регистрировать сервисы вручную, а также использовать сервис трекеров. Оба API трудно правильно использовать. Вместо этого используйте инфраструктуру внедрения зависимостей, такую ​​как декларативные сервисы.

Ваш случай управления источниками данных и пулами особенно сложен. Вы не должны делать это самостоятельно. Есть два существующих проекта, которые уже предоставляют то, что вам нужно.

  • pax jdbc предоставляет службы OSGi для DataSourceFactory для большинства популярных баз данных. Он также обрабатывает создание источников данных из конфигурации, а также пулов.
  • Управление транзакциями Овна даже идет немного дальше и предоставляет немного другую модель программирования для баз данных, которая очень хорошо подходит для OSGi. Он обрабатывает источники данных, пул и поддержку транзакций.

Поскольку ваш вопрос предполагает, что вы пытаетесь создавать микросервисы на OSGi, я также рекомендую учебник по микросервису enroute . Включает пример использования управления транзакциями.

...