实现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实现跨库查询的更多相关文章

  1. springboot整合mybatis进行跨库查询

    业务场景: 当一个公司大了之后就会将各种业务进行分开,最简单的就是例如:公司的机构表,那么就会将他们分成开来,那么就会在一个实例中, 如果要获取相关信息就会去关联这张表进行关联查询 从而导致了跨库关联 ...

  2. 如何使用SQL SERVER数据库跨库查询

    SQL Server中内置了数据库跨库查询功能,下面简要介绍一下SQL Server跨库查询.首先打开数据源码:OPENDATASOURCE不使用链接的服务器名,而提供特殊的连接信息,并将其作为四部分 ...

  3. ACCESS-如何多数据库查询(跨库查询)

    测试通过:ACCESSselect * from F:\MYk.mdb.tablename说明:1.查询语句2.来原于哪(没有密码是个路径)3.查询的表名 ====================== ...

  4. SqlServer跨库查询

    由于业务的拆分,数据库拆分为两种作用: 汇总数据库(Master,头节点数据库), 子节点数据库(Compute Node,计算子节点数据库) 这样,就设计到子节点访问头节点数据库中的某张汇总表,这种 ...

  5. Access数据库跨库查询及记录集区分

    医疗设备软件一般都是单机软件,如果是Windows平台,常会选择Access数据库存储结构化数据,因为他轻量,便于部署.然而随着医疗信息化的发展,医生希望对多台单机设备的数据进行管理,采用网络数据库当 ...

  6. EF 跨库查询

    原因:最近公司项目,遇到一个ef跨库查询的问题.(只是跨库,并不是跨服务器哈) 主要我们的一些数据,譬如地址,城市需要查询公共资料库. 但是本身我的程序设计采用的是ef框架的.因此为这事花费了1天时间 ...

  7. SQL Server 跨库查询

    1. 开启Ad Hoc Distributed Queries组件,在sql查询编辑器中执行如下语句: reconfigure reconfigure 2. 跨库查询操作 select * from ...

  8. 跨库查询(OpenDataSource)与链接服务器(Linking Server)

    一:跨库查询 Openrowset/opendatasource() is an ad-hoc method to access remote server's data. So, if you on ...

  9. mysql 跨库查询问题

    MySQL实现跨服务器查询 https://blog.csdn.net/LYK_for_dba/article/details/78180444 mysql> create database l ...

随机推荐

  1. 2015暑假多校联合---Zero Escape(变化的01背包)

    题目链接 http://acm.hust.edu.cn/vjudge/contest/130883#problem/C Problem Description Zero Escape, is a vi ...

  2. JS中跨域和沙箱的解析

    先来直接分析源码,如下: <!DOCTYPE HTML><html><head> <meta charset="UTF-8"/> & ...

  3. 泛函编程(5)-数据结构(Functional Data Structures)

    编程即是编制对数据进行运算的过程.特殊的运算必须用特定的数据结构来支持有效运算.如果没有数据结构的支持,我们就只能为每条数据申明一个内存地址了,然后使用这些地址来操作这些数据,也就是我们熟悉的申明变量 ...

  4. spring mvc+ELK从头开始搭建日志平台

    最近由于之前协助前公司做了点力所能及的事情,居然收到了一份贵重的端午礼物,是给我女儿的一个乐高积木,整个有7大包物件,我花了接近一天的时间一砖一瓦的组织起来,虽然很辛苦但是能够从过程中体验到乐趣.这次 ...

  5. orcl的小技巧和分页

    1Oracle中查看所有用户语句 select * from dba_users 1.修改用户的密码 alter user 用户名 identified by 密码; 2.如何查询stuInfo表中自 ...

  6. 15款加速 Web 开发的 JavaScript 框架

    JavaScript 可以通过多种方式来创建交互式的网站和 Web 应用程序.利用 JavaScript,可以让你移动 HTML 元素,创建各种各样的自定义动画,给你的访问者更好的终端用户体验. 对于 ...

  7. PyInstaller 安装方法 及简单的编译exe (python3)

    安装PyInstaller //地址 https://github.com/pyinstaller/pyinstaller/tree/python3 //上面的链接已经失效,新的(20160809更) ...

  8. AloneJs —— 简洁高效的JavaScript UI库

    以前做项目时用了一些第三方的JS UI库,项目比较low的时候用还行,一旦项目要求比较高,特别是交互比较复杂时,某些第三方UI库就显得无能为力,用起来也不顺手,改也不好改,所以我就自己基于jQuery ...

  9. 精通 CSS 选择器(二)

    补充了一些之前遗漏掉的选择器以及一些在 Selectors Level 4 中新定义的选择器. 属性选择器不区分大小写 [attribute="value" i],在 Select ...

  10. flume 集群安装

    ./pssh -h ./host/all.txt -P mkdir /usr/local/app ./pssh -h ./host/all.txt -P tar zxf /usr/local/soft ...