首先理解下什么是数据源,其实就是一个描述一个数据库连接的各个参数,并提供获取连接的方法,在javax包中,又对应的接口javax.sql.DataSource,打开源码可以看到有两个方法
public interfaceDataSourceextendsCommonDataSource,Wrapper {
Connection getConnection()throwsSQLException;
Connection getConnection(String username,String password) throwsSQLException;
}
在网络已经有文章使用spring配置动态数据源,关键类是AbstractRoutingDataSource,
在实现getConnection时,调用一个关键方法determineTargetDataSource,这个方法就用来实现决定数据源的逻辑,而我们是需要实现determineCurrentLookupKey方法即可。
但是在使用jdbcTemplate使用动态数据源时发现一个问题,就是只能切换到第一个数据源,其他配置的获取不到,就是没有实现动态数据源的效果,翻看源码会发现jdbcTemplate会使用DataSourceUtils.getConnection,然后调用dodoGetConnection获取连接,源码为
可以看到有个map,这个是和线程绑定的。而这个map是HashMap,所以我们实现的数据源,并没有每次调用getConnection方法。知道是HashMap也就知道怎么解决了,就是重写hashCode方法,所以在实现AbstractRoutingDataSource类时,重写hashCode方法就可以了,比如这样