如何在使用自定义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
相关产品推荐
相关产品推荐

