1,首先是对于数据源的配置
<bean id="dataSource"
class="com.howbuy.pa.framework.rdbms.datasourceRoute.DynamicDataSource">
<property name="targetDataSources">
<map>
<entry key="master" value-ref="master"></entry>
<entry key="slave" value-ref="slave"></entry>
</map>
</property>
<property name="defaultTargetDataSource" ref="master"></property>
</bean>
<bean id="master" class="com.howbuy.common.db.HowbuyBasicDataSource3"
destroy-method="close">
<property name="hpsUrl" value="http://it-server.howbuy.domain:8060/hps/ps" />
<property name="url" value="${master.ds.jdbcUrl}" />
<property name="username" value="${master.ds.user}" />
<!-- <property name="password" value="${master.ds.password}" /> -->
<property name="password" value="DB.mring-coop.PassWord" />
<property name="initialSize" value="${master.ds.initialSize}" />
<property name="minIdle" value="${master.ds.minIdle}" />
<property name="maxActive" value="${master.ds.maxActive}" />
<property name="maxWait" value="${master.ds.maxWait}" />
<property name="timeBetweenEvictionRunsMillis" value="${master.ds.timeBetweenEvictionRunsMillis}" />
<property name="minEvictableIdleTimeMillis" value="${master.ds.minEvictableIdleTimeMillis}" />
<property name="validationQuery" value="${master.ds.validationQuery}" />
<property name="testWhileIdle" value="${master.ds.testWhileIdle}" />
<property name="testOnBorrow" value="${master.ds.testOnBorrow}" />
<property name="testOnReturn" value="${master.ds.testOnReturn}" />
</bean>
<bean id="slave" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<property name="url" value="${slave.ds.jdbcUrl}" />
<property name="username" value="${slave.ds.user}" />
<property name="password" value="${slave.ds.password}" />
<property name="initialSize" value="${slave.ds.initialSize}" />
<property name="minIdle" value="${slave.ds.minIdle}" />
<property name="maxActive" value="${slave.ds.maxActive}" />
<property name="maxWait" value="${slave.ds.maxWait}" />
<property name="timeBetweenEvictionRunsMillis" value="${slave.ds.timeBetweenEvictionRunsMillis}" />
<property name="minEvictableIdleTimeMillis" value="${slave.ds.minEvictableIdleTimeMillis}" />
<property name="validationQuery" value="${slave.ds.validationQuery}" />
<property name="testWhileIdle" value="${slave.ds.testWhileIdle}" />
<property name="testOnBorrow" value="${slave.ds.testOnBorrow}" />
<property name="testOnReturn" value="${slave.ds.testOnReturn}" />
</bean>
配置中DynamicDataSource类是由自己新建 要求继承AbstractRoutingDataSource类:
public class DynamicDataSource extends AbstractRoutingDataSource
{
public DynamicDataSource()
{
}
protected Object determineCurrentLookupKey()
{
return DynamicDataSourceSwitch.getDataSource();
}
}
determineCurrentLookupKey方法内就是数据源切换的规则,可以自定义
2、切换数据源
数据源的切换时在代码内手动去做,一般是在Dao前,通过切面或者某种方式
DynamicDataSourceSwitch.setDataSource("slave");
补充一下这个类
public class DynamicDataSourceSwitch
{
public DynamicDataSourceSwitch()
{
}
public static void setDataSource(String name)
{
holder.set(name);
}
public static String getDataSource()
{
return (String)holder.get();
}
public static final ThreadLocal holder = new ThreadLocal();
}