Bog*_*art 5 java datasource connection-pooling jdbc spring-boot
我想创建两个单独的 JDBC 数据源(又名连接池),它们将重用类似于下图的连接。
.------.
'------'
| Data |
| base |
'------'
^
|
+------+-------+
| |
| Connection |
+--->| Pool Main |<----+
| | | |
| +--------------+ |
+------+----------+ +----------+--------+
|Connection Pool A| | Connection Pool B |
+-----------------+ +-------------------+
^ ^
| |
+-------+------+ +--------+-----+
| App Module A | | App Module B |
+--------------+ +--------------+
Run Code Online (Sandbox Code Playgroud)
想法是让父连接池的连接数限制为 10 个,每个子源的连接数限制为 8 个。
因此,即使应用程序模块 A 使用全部 8 个连接,模块 B 也不会饥饿并且至少有两个连接。
因此,要重新表述这个问题:我想以这样的方式表示单个连接池,即应用程序的一部分可以拥有至少 N 个连接(总共 M 个可用连接)。为应用程序的每个部分保留这 N 个连接。
这对于任何现有的库(例如HikariCP)来说都是可能的吗?
PS这是 spring boot 应用程序,但这应该不重要,因为 JDBC 数据源可以存在于 spring 之外。但也许 Spring 对于这个用例有一些技巧。
基于SpringBoot和HikariCP,尝试以下操作:
创建DataSourceConfig类来创建两个独立的HikariDataSource实例,每个实例代表子连接池A和B。
下面的每个数据源都配置了各自的最大连接限制(应用程序为 8),并将使用主连接池作为其基础源,并具有自己的最大连接限制(在本例中为 10)。
@Configuration
public class DataSourceConfig {
@Bean("mainDataPoolSource")
@Primary
public DataSource mainDataPoolSource() {
HikariConfig config = new HikariConfig();
config.setMaximumPoolSize(10);
// Configure other Main Connection Pool properties such as JDBC URL, username, password, etc.
return new HikariDataSource(config);
}
@Bean("dataPoolSourceA")
public DataSource dataPoolSourceA(@Qualifier("mainDataPoolSource") DataSource mainDataPoolSource) {
HikariConfig config = new HikariConfig();
config.setMaximumPoolSize(8);
// Configure other properties for App Module A
config.setDataSource(mainDataPoolSource);
return new HikariDataSource(config);
}
@Bean("dataPoolSourceB")
public DataSource dataPoolSourceB(@Qualifier("mainDataPoolSource") DataSource mainDataPoolSource) {
HikariConfig config = new HikariConfig();
config.setMaximumPoolSize(8);
// Configure other properties for App Module B
config.setDataSource(mainDataPoolSource);
return new HikariDataSource(config);
}
}
Run Code Online (Sandbox Code Playgroud)
为了使用 Spring 的依赖注入机制将每个模块分配给特定的数据源,下面的示例对应用程序模块 A 使用 @Autowired 和 @Qualifier 注释。
@Service
public class AppModuleAService {
private final DataSource dataPoolSourceA;
@Autowired
public AppModuleAService(@Qualifier("dataPoolSourceA") DataSource dataPoolSourceA) {
this.dataPoolSourceA = dataPoolSourceA;
}
// Use the dataPoolSourceA in your module A service methods
}
Run Code Online (Sandbox Code Playgroud)
对应用程序模块 B 重复此操作
| 归档时间: |
|
| 查看次数: |
372 次 |
| 最近记录: |