【问题标题】:Connection Pool for OSGI bundleOSGI 包的连接池
【发布时间】:2019-05-22 07:46:26
【问题描述】:

我正在尝试使用 OSGI 实现某种微服务架构。 我有 UserDAO 包,它从另一个包(连接器)中的连接池获取连接。 它们与 OSGI 服务 API 绑定。所以问题是:

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

如果我注册连接器(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(){}
}

我已经试过了。但是我也需要将接口的方法更改为静态方法,作为实现方法:

我不能使用这个,因为如果我将我的连接器类的接口注册为服务,它会导致错误“接口中的静态方法是不允许的”。

我应该从连接器类的所有方法中删除静态吗? 为什么每个人都在连接池中使用静态?

【问题讨论】:

    标签: java osgi connection-pooling hikaricp apache-commons-dbcp


    【解决方案1】:

    对于 OSGi 服务,您通常应该使用一个接口来宣布它。这样,服务的用户就不会绑定到您的实现类。

    在 OSGi 中使用静态方法返回连接通常是一个坏主意。您将希望使用 OSGi 配置来提供数据源的配置。这些配置在运行时提供,甚至可以在运行时消失。因此,您需要以应对配置或配置更改的方式来实现这一点。

    一个好的做法是在配置管理员向您提供配置后提供连接工厂作为服务,并在配置消失时删除该服务。

    使用普通的 OSGi API 完成所有这些工作非常麻烦。尽量避免手动注册服务以及使用服务跟踪器。这两种 API 都很难正确使用。而是使用依赖注入框架,如声明式服务。

    您管理数据源和池的情况特别复杂。你不应该自己这样做。有两个现有项目已经满足了您的需求。

    • pax jdbc 为大多数流行数据库的 DataSourceFactory 提供 OSGi 服务。它还处理从配置和池中创建数据源。
    • Aries Transaction control 甚至更进一步,为非常适合 OSGi 的数据库提供稍微不同的编程模型。它处理数据源、池和事务支持。

    正如您的问题所暗示的,您尝试在 OSGi 上构建微服务,我还推荐 enroute microservice tutorial。它包括一个使用事务控制的示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-14
      • 2014-06-07
      • 1970-01-01
      • 2017-02-12
      • 2013-08-20
      • 2016-10-03
      • 2019-10-03
      相关资源
      最近更新 更多