webService多数据源配置:
1.编写一个工具类获取数据源编号key
public class DateSourceKey {
//这里用的是ThreadLocal<String>的key是为了避免多并发时多个用户对同一个 key修改会发生冲突,所以此处用了线程本地化的技术来解决多并发问题
private static ThreadLocal<String>thread_local_key = new ThreadLocal<>();
public static String getKey() {
return thread_local_key.get();
}
public static void setKey(Stringkey) {
thread_local_key.set(key);
}
public static void clear_key() {
thread_local_key.remove();
}
}
2.编写一个自定义的数据源路由器类来*切换要访问的数据源例如类名:MyWsRoutingDataSource但是要继承AbstractRoutingDataSource抽象类才会有*切换数据源的功能,示例代码如下:
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class MyWsRoutingDataSourceextends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DateSourceKey.getKey();
}
}
3.在接口的实现类中设置数据源的key值:
package com.service;
import org.springframework.beans.factory.annotation.Autowired;
import com.bean.T_MALL_USER_ACCOUNT;
import com.mapper.UserMapper;
import com.util.DateSourceKey;
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
@Override
public T_MALL_USER_ACCOUNT login(T_MALL_USER_ACCOUNT user) {
DateSourceKey.setKey("2");//注意一定要在与数据库交互的业务代码前去设置key
T_MALL_USER_ACCOUNT login = userMapper.select_login(user);
System.out.println("用户信息:"+login);
return login;
}
}
4.key到底是什么呢?在spring配置文件中配置多个数据源和自定义的数据源路由器
示例代码如下:
<!-- 此处可以配置多个数据源文件也可以在同一个数据源文件中配置多个属性 -->
<context:property-placeholder location="classpath:dbConfig.properties,
classpath:dbConfig2.properties" />
<!-- 数据源1 -->
<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>
<!-- 数据源2 -->
<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>
<!-- 数据源路由器,注意一定要配置默认的数据源避免连接不到数据源且属性名一定写defaultTargetDataSource -->
<bean id="dataSource" class="com.util.MyWsRoutingDataSource">
<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="dataSource2"/>
</bean>