刚开始恒纠结一个问题,就是有spring容器已启动就已经将sessionFactory生成好了,怎么可能再去改变数据源,后来想想,spring容器创建好了datasource,我们动态的改变了datasource里面的选择那个数据源信息。
例如在一个spring和hibernate的框架的项目中,我们在spring配置中往往是配置一个dataSource来连接数据库,然后绑定给sessionFactory,在dao层代码中再指定sessionFactory来进行数据库操作。
下图为一个数据源:正如下图所示,每一块都是指定绑死的,没有一点灵活性,要是有多个数据源的话,配置就变得比较繁琐了。
下图为动态的切换数据源:
下图为spring.xml的数据源的配置文件
下图为sessionFactory绑定数据源
AbstractRoutingDataSource类:大概的作用就是根据getConnection()根据查找lookup key键对不同目标数据源的调用,通常是通过(但不一定)某些线程绑定的事物上下文来实现。
DynamicDataSource继承AbstractRoutingDataSource类,并实现了determineCurrentLookupKey()方法。
我们配置的多个数据源会放在AbstractRoutingDataSource的 targetDataSources和defaultTargetDataSource中,然后通过afterPropertiesSet()方法将数据源分别进行复制到resolvedDataSources和resolvedDefaultDataSource中。代码如下:
我们通过自己实现的determineCurrentLookupKey()方法返回了lookupKey,根据配置的key就获取到对应的数据源达到切换动态切换的功能。