AbstarctRoutingDataSource配合ThreadLocal实现分库

来源:互联网 发布:数据库的书籍 编辑:程序博客网 时间:2024/04/28 10:29

实现过程:

1.配置文件:配置数据表的连接信息生成bean,并将bean作为value,指定key名称,创建名为targetDataSourcesmap,该map通过spring初始化。

<bean id="ddpim" class="com.dangdang.item.ic.pub.pim.persistent.dynamic.DdpimDynamicDataSource"><property name="targetDataSources"><map key-type="java.lang.String"><entry key="ddpim" value-ref="ddpimDB" /><entry key="ddpim_00" value-ref="ddpim00" /><entry key="ddpim_01" value-ref="ddpim01" /><entry key="ddpim_02" value-ref="ddpim02" /><entry key="ddpim_03" value-ref="ddpim03" /><entry key="ddpim_04" value-ref="ddpim04" /><entry key="ddpim_05" value-ref="ddpim05" /><entry key="ddpim_06" value-ref="ddpim06" /><entry key="ddpim_07" value-ref="ddpim07" /><entry key="ddpim_08" value-ref="ddpim08" /><entry key="ddpim_09" value-ref="ddpim09" /></map></property><property name="defaultTargetDataSource" ref="ddpimDB" /></bean>

2.继承AbstarctRoutingDataSource抽象类,实现determineCurrentLookupKey方法,根据shopId取对应的数据库名称,并放入ThreadLocal,AbstarctRoutingDataSource类的determineTargetDataSource方法会调用determineCurrentLookupKey获取数据库的名称,然后从resolvedDataSources这个map中(由targetDataSources转换而来)获取对应数据库名称的sqlsession

/** * 数据源KEY */protected staticfinal ThreadLocal<String> dataSource = new ThreadLocal<String>();

//获取数据源KEYprotected ObjectdetermineCurrentLookupKey() {returndataSource.get();}
//AbstarctRoutingDataSource类中的determineTargetDataSource方法,调用determineCurrentLookupKey方法,获取数据源KEY,并根据KEY获取sqlsession。protected DataSource determineTargetDataSource() {Assert.notNull(this.resolvedDataSources, "DataSource router not initialized");Object lookupKey = determineCurrentLookupKey();DataSource dataSource = this.resolvedDataSources.get(lookupKey);if (dataSource == null && (this.lenientFallback || lookupKey == null)) {dataSource = this.resolvedDefaultDataSource;}if (dataSource == null) {throw new IllegalStateException("Cannot determine target DataSource for lookup key [" + lookupKey + "]");}return dataSource;}
 
原创粉丝点击