这里主要叙述多数据源相关配置和代码,(注:和多数据源无关的 类似与事务/引入,这些就不啰嗦了,可以查看其他类似博文)
1.首先是启动文件:
在 "spring-mvc.xml" 或者其他 相关项目启动就会运行的 配置文件中 配置数据源 ,这里配置了两个数据源,分别为"dataSource_jeecg",和"dataSource_two",可以两者之前进行切换,
<!-- 引入属性文件 -->
<context:property-placeholder location="classpath:dbconfig.properties" ignore-unresolvable="true"/>
<!-- 配置数据源1 -->
<bean name="dataSource_jeecg" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<property name="url" value="${jdbc.url.jeecg}"/>
<property name="username" value="${jdbc.username.jeecg}"/>
<property name="password" value="${jdbc.password.jeecg}"/>
<!-- 初始化连接大小 -->
<property name="initialSize" value="0"/>
<!-- 连接池最大使用连接数量 -->
<property name="maxActive" value="50"/>
<!-- 连接池最小空闲 -->
<property name="minIdle" value="5"/>
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="60000"/>
</bean>
<bean name="dataSource_two" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<property name="url" value="${jdbc.url.jeecg2}"/>
<property name="username" value="${jdbc.username.jeecg}"/>
<property name="password" value="${jdbc.password.jeecg}"/>
<!-- 初始化连接大小 -->
<property name="initialSize" value="0"/>
<!-- 连接池最大使用连接数量 -->
<property name="maxActive" value="50"/>
<!-- 连接池最小空闲 -->
<property name="minIdle" value="5"/>
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="60000"/>
</bean>
文章中的 key值取自属性文件 ,dbconfig.properties,因我所取的两个数据库在一台mysql中,所以数据库链接,端口号,用户名,密码都相同,不再多做配置.
#MySQL
hibernate.dialect=org.hibernate.dialect.MySQLDialect
validationQuery.sql=SELECT 1
jdbc.url.jeecg=jdbc:mysql://127.0.0.1:3306/jeecgdemo?useUnicode=true&characterEncoding=UTF-8
jdbc.url.jeecg2=jdbc:mysql://127.0.0.1:3306/xxdz?useUnicode=true&characterEncoding=UTF-8
jdbc.username.jeecg=root
jdbc.password.jeecg=123456
jdbc.dbType=mysql
2.配置工具类
"com.alibaba.druid.pool.DruidDataSource"类为阿里云提供的数据源链接工具类
"org.jeecgframework.core.extend.datasource.DynamicDataSource"为自定义 动态数据源类.
动态数据源类代码.
/**
*类名:DynamicDataSource.java
*功能:动态数据源类
*/
public class DynamicDataSource extends AbstractRoutingDataSource {
/*
*
*/
protected Object determineCurrentLookupKey() {
DataSourceType dataSourceType= DataSourceContextHolder.getDataSourceType();
return dataSourceType;
}
public void setDataSourceLookup(DataSourceLookup dataSourceLookup) {
super.setDataSourceLookup(dataSourceLookup);
}
public void setDefaultTargetDataSource(Object defaultTargetDataSource) {
super.setDefaultTargetDataSource(defaultTargetDataSource);
}
public void setTargetDataSources(Map targetDataSources) {
super.setTargetDataSources(targetDataSources);
}
}
"org.jeecgframework.core.extend.datasource.DataSourceType" 自定义枚举类
public enum DataSourceType {
dataSource_jeecg,dataSource_enter,dataSource4,mapdataSource,dataSource_two
}
还有一个切换上下文数据源类
/**
*类名:DataSourceContextHolder.java
*功能:获得和设置上下文环境的类,主要负责改变上下文数据源的名称
*/
public class DataSourceContextHolder {
private static final ThreadLocal contextHolder=new ThreadLocal();
public static void setDataSourceType(DataSourceType dataSourceType){
contextHolder.set(dataSourceType);
}
public static DataSourceType getDataSourceType(){
return (DataSourceType) contextHolder.get();
}
public static void clearDataSourceType(){
contextHolder.remove();
}
}
3.测试类
@Controller
@RequestMapping("/test")
public class Test {
@Autowired
JeecgDemoServiceI commonService;
@RequestMapping(params = "test1")
public void test1(String userid, HttpServletRequest request, HttpServletResponse response) {
String sb = "select id from t_s_base_user where realname = 'demoasdasd'";
List<Map<String, Object>> objMapList = commonService.findForJdbc(sb, 1, 1);
System.out.println("主数据源-------------------");
System.out.println(objMapList);
DataSourceContextHolder.setDataSourceType(DataSourceType.dataSource_two);// 切换数据源
String sb2 = "select id from t_s_base_user where realname = 'demoasdasd'";
List<Map<String, Object>> objMapList2 = commonService.findForJdbc(sb2, 1, 1);
System.out.println("切换之后数据源-------------------");
System.out.println(objMapList2);
}
}
打印结果:
主数据源-------------------
[]
切换之后数据源-------------------
[{id=402831816224cfcd016224dffa7e000f}]