使两个 java JDBC DataSources 使用单一支持 DataSource 作为其源

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 对于这个用例有一些技巧。

djm*_*nki 5

基于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 重复此操作