Spring配置RoutingDataSource實現mysql讀寫分離

zhumeilu發表於2017-12-14

首先我們先配置兩個資料來源:

<!-- 1:資料來源 -->
<bean id="masterDs" class="com.alibaba.druid.pool.DruidDataSource"
	destroy-method="close">
	<property name="driverClassName" value="${jdbc.driverClassName}" />
	<property name="url" value="${jdbc.url}" />
	<property name="username" value="${jdbc.username}" />
	<property name="password" value="${jdbc.password}" />
</bean>

<bean id="slaveDs" class="com.alibaba.druid.pool.DruidDataSource"
	destroy-method="close">
	<property name="driverClassName" value="${jdbc2.driverClassName}" />
	<property name="url" value="${jdbc2.url}" />
	<property name="username" value="${jdbc2.username}" />
	<property name="password" value="${jdbc2.password}" />
</bean>
複製程式碼

接著 org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource是一個路由分發資料來源,負責對資料來源的切換。由於它是抽象的,我們需要自己寫一個類來繼承它,並且實現裡面的抽象方法。

public class P2PDataSource extends AbstractRoutingDataSource{

        //這個方法返回當前使用資料來源的名稱
        //DataSourceContext裡面有一個執行緒變數,用來設定和獲取當前執行緒也就是當前這個請求使用的資料來源是哪一個
	@Override
	protected Object determineCurrentLookupKey() {
		if(DataSourceContext.get()==null){
			return null;
		}
		if(DataSourceContext.get().equals(BidConst.MASTER_DATASOURCE)){
			return "masterDs";
		}else{
			return "slaveDs";
		}
	}

}
複製程式碼

資料來源上下文:用來儲存當前請求的資料來源名稱

public class DataSourceContext {

	private static ThreadLocal<String> dataSource=new ThreadLocal<>();
	
	public static void set(String dataSource){
		DataSourceContext.dataSource.set(dataSource);			
	}
	public static String get(){
		return DataSourceContext.dataSource.get();
	}
}
複製程式碼

配置路由資料來源

<!-- 配置路由分發DataSource -->
<bean id="dataSource" class="com.xmg.p2p.base.util.P2PDataSource">
	<property name="targetDataSources">
		<map>
			<entry key="master" value-ref="masterDs"></entry>
			<entry key="slave" value-ref="slaveDs"></entry>
		</map>
	</property>
	<property name="defaultTargetDataSource" ref="masterDs"></property>
</bean>
複製程式碼

最後在需要讀的serviceImpl的方法裡面先設定資料來源: DataSourceContext.dataSource.set(“slaveDs”); 然後在進行讀的操作。

相關文章