现在有个 spring boot 2.x 项目
创建了一个 AbstractRoutingDataSource 的实现类,以便动态切换数据源
而数据库访问使用了 JdbcTemplate 。
实际使用的过程中,发现 JdbcTemplate 第二次以及之后的数据源切换不生效 查看 JdbcTemplate 的源码发现 JdbcTemplate 内部实现了 connection 缓存,导致第二次访问的时候,直接拿了缓存的 connection ,而不是访问 datasource 获取。
ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);
if (conHolder != null && (conHolder.hasConnection() || conHolder.isSynchronizedWithTransaction())) {
conHolder.requested();
if (!conHolder.hasConnection()) {
logger.debug("Fetching resumed JDBC Connection from DataSource");
conHolder.setConnection(fetchConnection(dataSource));
}
return conHolder.getConnection();
}
这样导致了动态数据源功能只能实现一次,第一次确定数据源之后一直是这个。 百度个谷歌了一下,发现都是通过直接 new 一个 JdbcTemplate ,然后在构造函数里塞了一个 datasource 实现的, 但这样就不能依赖注入 JdbcTemplate 了。
不知道还有没有更好的解决访问。