之前有个项目最近整理出来共享给大家。
公共查询服务,公司查询场景越来越多,主库压力越来越大,一些非实时数据通过查询丛库数据来减少主库的压力,也防止主库出现故障导致网站不可访问而出现的崩溃。
在一个项目里面配置主从数据源进行查询,考虑最原始的方案就是通过不同的sessionFactory指向不同的数据源进行数据源切换查询。发现如果后面修改接口或者添加接口就需要写双份和改双份,这是非常不方便的。最后发现了spring下面的org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource类:
通过getConnection()方法获取连接-->通过determineTargetDataSource()方法获取DataSource数据源-->通过determineCurrentLookupKey获取数据源在resolvedDataSources这个map里面存在的数据源连接-->resolvedDataSources主要是获取targetDataSources里面的数据源配置
AbstractRoutingDataSource源码如下:
恍然大悟可以通过继承AbstractRoutingDataSource类,重写determineCurrentLookupKey方法获取数据源的key。
下面就改AOP上场了,通过@Around("@annotation(dataSourceSelect)")拦截执行方法上面有@dataSourceSelect注解获取注解里面的值,把值存放到ThreadLocal-->LinkedList里面,查询的时候调用重写后的determineCurrentLookupKey方法获取LinkedList的第一个元素,这样执行查询的时候数据源就完成切换了。@Around最后通过poll清楚LinkedList的头部的值。