数据源切换,一般应用在分库分表情况,根据不同的信息将内容存储到对应的数据库。
在服务接口的项目中
1.写一个工具类,用于切换数据源
其中如果直接用共享的key会导致线程不安全,需要绑定各自的key,则需要用到ThreadLocal进行绑定
package com.demo.utils;
public class MyLookupKey {
private static ThreadLocal<String> lookupKey = new ThreadLocal<String>();
public static String getLookupKey() {
return lookupKey.get();
}
public static void setLookupKey(String key_in) {
lookupKey.set(key_in);
}
}
2.写一个工具类,继承AbstractRoutingDataSource
通过切换数据源的工具类获取数据源
package com.demo.utils;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
/**
* 继承AbstractRoutingDataSource
* @author guohongyan
*
*/
public class MyDateSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return MyLookupKey.getLookupKey();
}
}
3.在dbConfig.xml文件加入数据源的Url
driverClassName=com.mysql.jdbc.Driver
url1=jdbc:mysql://192.168.30.57:3306/project?useUnicode=true&characterEncoding=UTF-8
url2=jdbc:mysql://192.168.30.57:3306/project_user?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=root
4.applicationContext.xml文件中配置数据源路由器
<bean class="com.atguigu.utils.MyDateSource" id="dataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry key="1" value-ref="dataSource1"/>
<entry key="2" value-ref="dataSource2"/>
</map>
</property>
<property name="defaultTargetDataSource" ref="dataSource1"></property>
</bean>
<bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${driverClassName}" />
<property name="url" value="${url1}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${driverClassName}" />
<property name="url" value="${url2}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
5.在login方法中,查询数据库之前,切换数据源
@Override
public User login(User user) {
MyLookupKey.setLookupKey("2");
return userMapper.select_user(user);
}