多数据源场景下,调试时如何查看请求使用的DataSource?
调试多数据源切换的方法
一、核心断点:定位数据源选择逻辑
直接在你的RoutingDataSource类的determineCurrentLookupKey()方法上设置断点——这是动态路由数据源的核心触发点,每次需要获取数据库连接时都会调用它。调试时观察返回值即可明确当前使用的数据源:
- 返回
TransactionType.READ_WRITE,对应读写数据源 - 返回
TransactionType.READ_ONLY,对应只读数据源
二、验证实际使用的数据源实例
如果要确认最终拿到的具体HikariDataSource实例,可以在以下位置加断点:
HikariDataSource的getConnection()方法:每次获取连接时触发,调试时查看实例的jdbcUrl、username等属性,直接区分读写/只读库- 你的
DataSourceConfig类中readWriteDataSource()和readOnlyDataSource()方法:初始化阶段可以记录两个实例的引用,后续运行时对比确认
三、结合事务上下文追踪切换逻辑
如果是通过@Transactional注解的readOnly属性触发数据源切换,还可以在Spring的TransactionInterceptor.invoke()方法上设断点——这里会解析事务属性,判断是否为只读事务,进而设置对应的TransactionType,能完整追踪从事务注解到数据源选择的全流程
调试小技巧
- 在
determineCurrentLookupKey()方法内,查看存储TransactionType的ThreadLocal变量,确认当前线程的事务类型设置是否符合预期 - 给两个
HikariDataSource实例配置不同的poolName(对应配置文件里的spring.read-write.datasource.configuration.pool-name和spring.read-only.datasource.configuration.pool-name),调试时一眼就能区分实例归属
内容的提问来源于stack exchange,提问作者Valery Proskuryakov
相关产品推荐
相关产品推荐

