OSGI捆绑软件的连接池

时间:2019-05-22 07:46:26

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

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

1)我应该将接口(IConnector)注册为该接口(连接器)的服务还是实现:

 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(){}
}

我已经尝试过了。但是然后,我也需要将接口的方法也更改为静态方法,作为一种实现方法: enter image description here

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

enter image description here

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

1 个答案:

答案 0 :(得分:1)

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

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

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

使用普通的OSGi API进行所有操作非常麻烦。尝试避免手动注册服务以及使用服务跟踪器。两种API均难以正确使用。而是使用诸如声明式服务之类的依赖项注入框架。

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

  • pax jdbc为大多数流行的数据库的DataSourceFactory提供OSGi服务。它还处理从配置以及池创建DataSources的过程。
  • Aries Transaction control甚至走得更远,并且为数据库提供了稍有不同的编程模型,非常适合OSGi。它处理数据源,池化和事务支持。

由于您的问题建议您尝试在OSGi上构建微服务,因此我也推荐enroute microservice tutorial。它包含一个使用事务控制的示例。