多租户应用使用HikariCP仅显示首个池日志及租户建池方案咨询
问题1:如何查看所有连接池的debug日志
你看不到其他连接池日志的核心原因是HikariCP不会在创建实例时就初始化连接池,只有当第一次实际请求获取连接时才会触发池的初始化,输出对应日志,你当前的配置下AbstractRoutingDataSource只有路由到对应租户请求时才会调用对应数据源的getConnection方法,没被访问过的租户连接池自然不会产生日志。
可以按以下方式验证:
- 新增租户后主动发起一次对应租户的数据库操作,触发连接池初始化,即可在日志中看到对应池名的debug输出
- 如果需要新增数据源时立即初始化,可在
buildDataSource方法返回之前新增一行代码主动触发初始化:
// 主动获取一次连接触发池初始化,之后立即释放不占用资源 dataSource.getConnection().close();
另外注意你代码中的成员变量i和targetDataSources都是线程不安全的,多线程并发新增租户时会出现池名重复、Map数据异常的问题,建议替换为AtomicInteger和ConcurrentHashMap。
问题2:每个租户单独创建连接池的方案是否合理
这个方案没有绝对的好坏,需要结合你的业务场景判断:
适用场景
- 租户规模小(通常50个以内),对数据隔离性要求极高(比如金融、涉密类系统),要求租户之间完全物理隔离数据库,这种方案的隔离性是所有多租户方案里最高的,不会出现租户之间连接争抢、数据越权的问题。
存在的问题
- 扩展性极差:每个连接池哪怕你配置最小空闲连接为1,1000个租户就会占用至少1000个数据库连接,数据库服务端的连接上限很容易被打满,应用端的内存开销也会随租户数量线性增长,租户超过百级就不推荐用这种方案。
- 资源利用率极低:大部分租户如果访问频率很低,对应的连接池占着的连接长期空闲,完全浪费资源。
替代方案
如果租户规模较大,对隔离性要求没到物理隔离的程度,更推荐用「共享连接池+Schema隔离」的方案:所有租户共用同一个Hikari连接池,请求路由到对应租户时动态切换数据库Schema,连接复用率高,资源开销小,隔离性也能满足绝大多数业务场景需求。
内容的提问来源于stack exchange,提问作者vivek
相关产品推荐
相关产品推荐

