jdbcTemplate使用spring动态数据源配置时的问题

首先理解下什么是数据源,其实就是一个描述一个数据库连接的各个参数,并提供获取连接的方法,在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获取连接,源码为


jdbcTemplate使用spring动态数据源配置时的问题_第1张图片


jdbcTemplate使用spring动态数据源配置时的问题_第2张图片

可以看到有个map,这个是和线程绑定的。而这个map是HashMap,所以我们实现的数据源,并没有每次调用getConnection方法。知道是HashMap也就知道怎么解决了,就是重写hashCode方法,所以在实现AbstractRoutingDataSource类时,重写hashCode方法就可以了,比如这样


jdbcTemplate使用spring动态数据源配置时的问题_第3张图片

你可能感兴趣的:(jdbcTemplate使用spring动态数据源配置时的问题)