OSGI 包的连接池
Connection Pool for OSGI bundle
我正在尝试使用 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(){}
}
我试过了。但是后来我也需要将接口的方法更改为静态方法,作为实现方法:
我不能使用它,因为如果我将我的连接器 class 的接口注册为服务,它会导致错误 "static method in interface is not allowed"。
我是否应该从连接器 class 中的所有方法中删除静态?
为什么每个人都在连接池中使用静态?
对于 OSGi 服务,您通常应该使用接口来宣布它。这样,服务的用户就不会绑定到您的实现 class.
使用静态方法 return 连接在 OSGi 中通常不是一个好主意。您需要使用 OSGi 配置来提供数据源的配置。这些配置在运行时提供,甚至可以在运行时消失。因此,您需要以应对配置或配置更改的方式来实现它。
一个好的做法是在配置管理员为您提供配置后,为连接提供一个工厂作为服务,并在配置消失时删除该服务。
使用普通 OSGi API 完成所有这些操作非常麻烦。尽量避免手动注册服务以及使用服务跟踪器。这两种 API 都很难正确使用。而是使用像声明式服务这样的依赖注入框架。
您管理数据源和池的情况特别复杂。你不应该自己这样做。有两个现有项目已经提供了您所需要的。
- pax jdbc 为大多数流行数据库的 DataSourceFactory 提供 OSGi 服务。它还处理从配置和池中创建数据源。
- Aries Transaction control 甚至更进一步,为非常适合 OSGi 的数据库提供了一种略有不同的编程模型。它处理数据源、池和事务支持。
正如您的问题所暗示的,您尝试在 OSGi 上构建微服务,我也推荐 enroute microservice tutorial。它包括一个使用事务控制的示例。
我正在尝试使用 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(){}
}
我试过了。但是后来我也需要将接口的方法更改为静态方法,作为实现方法:
我不能使用它,因为如果我将我的连接器 class 的接口注册为服务,它会导致错误 "static method in interface is not allowed"。
我是否应该从连接器 class 中的所有方法中删除静态? 为什么每个人都在连接池中使用静态?
对于 OSGi 服务,您通常应该使用接口来宣布它。这样,服务的用户就不会绑定到您的实现 class.
使用静态方法 return 连接在 OSGi 中通常不是一个好主意。您需要使用 OSGi 配置来提供数据源的配置。这些配置在运行时提供,甚至可以在运行时消失。因此,您需要以应对配置或配置更改的方式来实现它。
一个好的做法是在配置管理员为您提供配置后,为连接提供一个工厂作为服务,并在配置消失时删除该服务。
使用普通 OSGi API 完成所有这些操作非常麻烦。尽量避免手动注册服务以及使用服务跟踪器。这两种 API 都很难正确使用。而是使用像声明式服务这样的依赖注入框架。
您管理数据源和池的情况特别复杂。你不应该自己这样做。有两个现有项目已经提供了您所需要的。
- pax jdbc 为大多数流行数据库的 DataSourceFactory 提供 OSGi 服务。它还处理从配置和池中创建数据源。
- Aries Transaction control 甚至更进一步,为非常适合 OSGi 的数据库提供了一种略有不同的编程模型。它处理数据源、池和事务支持。
正如您的问题所暗示的,您尝试在 OSGi 上构建微服务,我也推荐 enroute microservice tutorial。它包括一个使用事务控制的示例。