服务后端实现 多数据源

6 篇文章 0 订阅

这里主要叙述多数据源相关配置和代码,(注:和多数据源无关的 类似与事务/引入,这些就不啰嗦了,可以查看其他类似博文)

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}]

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值