You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在使用自定义DataSourceFactory的Tomcat应用中集成FlexyPool?

适配方案

你可以选择以下任意一种方案实现适配,推荐优先选择第二种方案,无需修改现有自定义工厂逻辑,侵入性更低。

方案一:修改CustomDataSourceFactory逻辑

  • 保留原有context.xml的配置不变,直接修改自定义工厂的返回逻辑,在返回数据源前用FlexyPool做一层包装,示例代码如下:
import javax.naming.Context;
import javax.naming.Name;
import javax.naming.spi.ObjectFactory;
import javax.sql.DataSource;
import com.vladmihalcea.flexypool.FlexyPoolDataSource;
import java.util.Hashtable;

public class CustomDataSourceFactory implements ObjectFactory {
    @Override
    public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) throws Exception {
        // 保留原有占位符替换逻辑,生成原始的MySQL数据源实例
        DataSource originalDataSource = 原有逻辑生成的未包装数据源;
        
        // 新增FlexyPool包装逻辑
        FlexyPoolDataSource<DataSource> flexyPoolDataSource = new FlexyPoolDataSource<>(originalDataSource);
        return flexyPoolDataSource;
    }
}
  • 该方案下可以删除flexy-pool.properties中flexy.pool.data.source.jndi.name配置项,不需要走FlexyPool自带的JNDI代理逻辑。

方案二:修改Guice绑定逻辑(推荐)

该方案完全不需要修改现有自定义工厂、context.xml配置,仅调整Guice的数据源绑定逻辑即可,代码修改如下:

import com.vladmihalcea.flexypool.FlexyPoolDataSource;
import javax.sql.DataSource;

bind(DataSource.class).toProvider(() -> {
    // 先从JNDI获取原始的经过占位符替换的数据源
    DataSource originalDs = fromJndi(DataSource.class, "java:comp/env/jdbc/MySQLDB").get();
    // 用FlexyPool包装后返回
    return new FlexyPoolDataSource<>(originalDs);
});
  • 该方案下你已经添加的flexy-pool.properties配置可以直接正常使用。

注意事项

  • 如果你使用Tomcat自带的JDBC连接池、DBCP2等特定连接池实现,需要额外引入FlexyPool对应的适配依赖,否则会无法采集连接池的指标。
  • 如果需要自定义FlexyPool的扩容策略、指标上报方式等配置,可以使用FlexyPoolDataSource.Builder构造实例,按需传入自定义配置即可。

内容的提问来源于stack exchange,提问作者Manoj Govindan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 15:36:04