SSM多数据源配置
到新的公司,公司有配置多数据源的需求,就自己学了
首先:
思路真的很重要,如果大家看过别的小伙伴写的博客之后,大概都有那么一点思路了,下面我说说我的思路
其实多数据源的配置,就是四步
一、配置和原来一个一样的数据源,
二、数据源的管理,
三、sqlSessionFactory用相应的数据源
四、程序里面怎么决定我这支交易到底要调那个数据源
下面我们来看看我的第一步:
<!-- 配置数据源-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://192.168.3.164:3307/quanxian?useUnicode=true&characterEncoding=utf8" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<!-- 第二个数据源 -->
<bean id="dataSourceTwo" class="org.springframework.jdbc.datasource.DriverManagerDataSource"
>
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://192.168.3.164:3307/world?useUnicode=true&characterEncoding=utf8" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
第二步:数据源的管理
<bean id="dynamicDataSource" class="com.core.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<!-- 第一个数据源 -->
<entry value-ref="dataSource" key="dataSource"></entry>
<!-- 第二个数据源 -->
<entry value-ref="dataSourceTwo" key="dataSourceTwo"></entry>
</map>
</property>
<!-- 默认数据源 当程序没有指定用哪个数据源的时候系统就会调用这个默认的数据源 -->
<property name="defaultTargetDataSource" ref="dataSource">
</property>
</bean>
第三步:sqlSessionFactory调用数据源数据
<!-- 配置数据库连接 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- dynamicDataSource 是管理数据 源的id 以前我们写的是 dataSource 就是我们只有一个数据源的时候的那个数据源,那个时候 的数据源是死的,而现在这个数据源是活的,可能 是数据源一,
可能 是数据二,也就 是说 以前ref='dataSource'都可以写成ref='dynamicDateSource' -->
<property name="dataSource" ref="dynamicDataSource" />
<!-- 自动扫描mapping.xml文件 -->
<property name="mapperLocations" value="classpath:com/wxj/quanxian/mapper/*.xml"></property>
</bean>
第四步:程序里面调用相应的数据源
大家 注意,我在第二步的class里面有一个com.core.DynamicDataSource 我最开始的时候以为是导的某个架包里面的类,后来发现不是的,原来是需要自己写的一个类
DynamicDataSource 继承了AbstractRoutingDataSource 类
其实DynamicDataSource 的功能 就只是获取到具体的数据源,而AbstractRoutingDataSource 主要的功能就是设置和获取数据源
package com.core;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
// TODO Auto-generated method stub
return DatabaseContextHolder.getDataSource();
}
}
package com.core;
public class DatabaseContextHolder {
/**
* 注意:数据源标识保存在线程变量中,避免多线程操作数据源时互相干扰
*/
private static final ThreadLocal<String> THREAD_DATA_SOURCE = new ThreadLocal<String>();
public static String getDataSource() {
return THREAD_DATA_SOURCE.get();
}
public static void setDataSource(String dataSource) {
THREAD_DATA_SOURCE.set(dataSource);
}
public static void clearDataSource() {
THREAD_DATA_SOURCE.remove();
}
}
真正设置和调用数据源
@Override
public List<City> queryCity() {
System.out.println("queryCity");
DatabaseContextHolder holder = new DatabaseContextHolder();
holder.setDataSource("dataSourceTwo");//设置第二个数据源,这里如果不设置它就调用默认的数据源
return cityDao.queryCity();
}
下图为图解: