spring多数据源的处理 mybatis实现跨库查询
实现Myibatis动态sql跨数据库的处理
Spring动态配置多数据源,即在大型应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效提高系统的水平伸缩性。而这样的方案就会不 同于常见的单一数据实例的方案,这就要程序在运行时根据当时的请求及系统状态来动态的决定将数据存储在哪个数据库实例中,以及从哪个数据库提取数据。
Spring配置多数据源的方式和具体使用过程。
Spring对于多数据源,以数据库表为参照,大体上可以分成两大类情况:
一是,表级上的跨数据库。即,对于不同的数据库却有相同的表(表名和表结构完全相同)。
二是,非表级上的跨数据库。即,多个数据源不存在相同的表。
Spring2.x的版本中采用Proxy模式,就是我们在方案中实现一个虚拟的数据源,并且 用它来封装数据源选择逻辑,这样就可以有效地将数据源选择逻辑从Client中分离出来。Client提供选择所需的上下文(因为这是Client所知道 的),由虚拟的DataSource根据Client提供的上下文来实现数据源的选择。
具体的实现就是,虚拟的DataSource仅需继承AbstractRoutingDataSource实现determineCurrentLookupKey()在其中封装数据源的选择逻辑。
一、动态配置多数据源
1. 数据源的名称常量类:
package com.hope.common.data;
public class DataSourceConst {
public static final String MANAGER = "MANAGER";
public static final String STMT = "STMT";
public static final String NODB = "NODB";
}
2. 建立一个获得和设置上下文环境的类,主要负责改变上下文数据源的名称:
public class DataSourceHandle {
private static final ThreadLocal contextHolder = new ThreadLocal(); // 线程本地环境
// 设置数据源类型
public static void setDataSourceType(String dataSourceType) {
contextHolder.set(dataSourceType);
}
// 获取数据源类型
public static String getDataSourceType() {
return (String) contextHolder.get();
}
// 清除数据源类型
public static void clearDataSourceType() {
contextHolder.remove();
}
}
3. 建立动态数据源类,注意,这个类必须继承AbstractRoutingDataSource,且实现方法 determineCurrentLookupKey,该方法返回一个Object,一般是返回字符串:
package com.hope.datasource;
public class DynamicDataSource extends AbstractRoutingDataSource {
public DynamicDataSource(){
}
@Override
protected Object determineCurrentLookupKey() {
// 在进行DAO操作前,通过上下文环境变量,获得数据源的类型
return DataSourceHandle.getDataSourceType();
}
} 4. 编写spring的配置文件配置多个数据源
<!-- spring配置多数据源 -->
<bean id="parentDataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver"></property>
<property name="username" value="sa"></property>
<property name="password" value="sa</property>
</bean>
<!-- 以下是配置各个数据库的特性 -->
<!-- 数据库 -->
<bean id="NODBDataSource" parent="parentDataSource">
<property name="url" value="jdbc:jtds:sqlserver://localhost:1433/" />
</bean>
<bean id="managerDataSource" parent="parentDataSource">
<property name="url"
value="jdbc:jtds:sqlserver://localhost:1433/test1
</bean>
<bean id="statDataSource" parent="parentDataSource">
<property name="url" value="jdbc:jtds:sqlserver://localhost:1433/test2
</bean>
<bean id="dataSource" class="com.hope.common.data.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry value-ref="managerDataSource" key="MANAGER"></entry>
<entry value-ref="statDataSource" key="STMT"></entry>
<entry value-ref="NODBDataSource" key="NODB"></entry>
</map>
</property>
<property name="defaultTargetDataSource" ref="managerDataSource"></property>
</bean>
5. ibatis 相关sql
<select id="selectDBDictionary" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
select a.id,a.parentid,a.cname,a.priority,a.ifactive from hopetas_manager.dbo.dictionary a inner join zj.dbo.dictionary b on a.id=b.id where a.parentid= #{id,jdbcType=INTEGER}
</select>
6.程序调用: 在DAO操作前处理set setDataSourceType 的值
// 利用递归来处理字段
public void getDict0(Eement element, Integer id,Integer j) {
// 设置数据源
DataSourceHandle.setDataSourceType(DataSourceConst.NODB);
ArrayList list = (ArrayList) this.dictMapper
.selectDBDictionary(id);
String str = "dir";
j++;
if (list.size() != 0 && list != null) {
for (Iterator iter = list.iterator(); iter.hasNext();) {
Dictionary dict = (Dictionary) iter.next();
Element el = element.addElement(str+j);
Element prop1 = el.addAttribute("id", dict.getId().toString());
Element prop2 = el.addAttribute("name", dict.getCname()
.toString());
getDict0(el, dict.getId(),j);
}
}
}
spring多数据源的处理 mybatis实现跨库查询的更多相关文章
- springboot整合mybatis进行跨库查询
业务场景: 当一个公司大了之后就会将各种业务进行分开,最简单的就是例如:公司的机构表,那么就会将他们分成开来,那么就会在一个实例中, 如果要获取相关信息就会去关联这张表进行关联查询 从而导致了跨库关联 ...
- 如何使用SQL SERVER数据库跨库查询
SQL Server中内置了数据库跨库查询功能,下面简要介绍一下SQL Server跨库查询.首先打开数据源码:OPENDATASOURCE不使用链接的服务器名,而提供特殊的连接信息,并将其作为四部分 ...
- ACCESS-如何多数据库查询(跨库查询)
测试通过:ACCESSselect * from F:\MYk.mdb.tablename说明:1.查询语句2.来原于哪(没有密码是个路径)3.查询的表名 ====================== ...
- SqlServer跨库查询
由于业务的拆分,数据库拆分为两种作用: 汇总数据库(Master,头节点数据库), 子节点数据库(Compute Node,计算子节点数据库) 这样,就设计到子节点访问头节点数据库中的某张汇总表,这种 ...
- Access数据库跨库查询及记录集区分
医疗设备软件一般都是单机软件,如果是Windows平台,常会选择Access数据库存储结构化数据,因为他轻量,便于部署.然而随着医疗信息化的发展,医生希望对多台单机设备的数据进行管理,采用网络数据库当 ...
- EF 跨库查询
原因:最近公司项目,遇到一个ef跨库查询的问题.(只是跨库,并不是跨服务器哈) 主要我们的一些数据,譬如地址,城市需要查询公共资料库. 但是本身我的程序设计采用的是ef框架的.因此为这事花费了1天时间 ...
- SQL Server 跨库查询
1. 开启Ad Hoc Distributed Queries组件,在sql查询编辑器中执行如下语句: reconfigure reconfigure 2. 跨库查询操作 select * from ...
- 跨库查询(OpenDataSource)与链接服务器(Linking Server)
一:跨库查询 Openrowset/opendatasource() is an ad-hoc method to access remote server's data. So, if you on ...
- mysql 跨库查询问题
MySQL实现跨服务器查询 https://blog.csdn.net/LYK_for_dba/article/details/78180444 mysql> create database l ...
随机推荐
- Maven编译jar出现:无法确定 T 的类型参数的异常的原因和处理方案
出错场景: 代码: public class JsonUtil { private static final Gson gson = new GsonBuilder().setDateFormat(& ...
- 性能测试学习之三—— PV->TPS转换模型&TPS波动模型
PV->TPS转换模型 由上一篇“性能测试学习之二 ——性能测试模型(PV计算模型)“ 得知 TPS = ( (80%*总PV)/(24*60*60*(T/24)))/服务器数量 转换需要注意: ...
- Linux学习笔记17--Linux系统启动详解
多数操作系统的启动流程: BIOS启动自检 ->MBR引导->执行引导程序GRUB->加载内核->执行init->runlevel BIOS(Basic Input ...
- Sitecake – 可视化编辑,所见即所得的 CMS
Sitecake 是一个易于使用的,用于制作小型网站的 CMS(内容管理系统).提供所见即所得.拖拽操作的编辑器.只需要安装标准的虚拟主机包(Web服务器和 PHP 5.4+)就可以了.Sitecak ...
- HoverTree菜单0.1.3新增效果
HoverTree菜单0.1.3增加弹出菜单的动态效果,可以是动态下拉,也可以是动态淡入. 效果请看:http://keleyi.com/jq/hovertree/demo/demo.0.1.3.ht ...
- Welcome Phalcon
Welcome! 欢迎来到 Phalcon 框架, 一种崭新的 PHP 框架.我们的使命是给开发者一个开发 web 站点和应用的高级工具,让开发者不用担心框架的性能问题. Phalcon 是什么? P ...
- js异步编程
前言 以一个煮饭的例子开始,例如有三件事,A是买菜.B是买肉.C是洗米,最终的结果是为了煮一餐饭.为了最后一餐饭,可以三件事一起做,也可以轮流做,也可能C需要最后做(等A.B做完),这三件事是相关的, ...
- 前端安全之XSS攻击
XSS(cross-site scripting跨域脚本攻击)攻击是最常见的Web攻击,其重点是“跨域”和“客户端执行”.有人将XSS攻击分为三种,分别是: 1. Reflected XSS(基于反射 ...
- js的一些坑,持续增加,学习js应该注意的问题
大家来补充 1.变量类型模糊,容易出现问题; var a='1',b=1; a==b; //true a===b; //false 2.全局变量与函数内部变量同名时,在函数内部声明变量,声明位置虽然在 ...
- Flex Viewer
一.Flex Viewer简介 Flex Viewer是ESRI公司推出的可以高效开发基于WEB的地理信息应用系统的一种完全免费的应用程序框架.业务人员使用该框架可以无需任何额外的编程就能够通过简单配 ...