Spring Mybatis的分库分表方式

转载:http://blog.csdn.net/a63297066/article/details/51459422

数据库分库   :表示同一个Dao操作,会操作到不同的库里面去,对于Mybatis来说,就是对应不同的数据库源,即不同的SessionFactory。

数据库分表 :表示同一个Dao操作,会操作到同一个库的不同的表里去。即变动SQL语句指向的数据库表。


无论是自主开发实现还是利用现有的开源框架,都会面临一个在哪一层上实现sharding逻辑的问题。

从一个系统的程序架构层面来看,sharding逻辑可以在:

1、DAO层

2、ORM框架层

3、JDBC API层

4、介于DAO与JDBC之间的spring数据访问封装层

5、介于应用服务器与数据库之间的sharding代理服务器。


Dao层实现

在DAO层自行实现sharding的优势在于:不受ORM框架的制约、实现起来较为简单、易于根据系统特点进行灵活的定制、无需SQL解析和路由规则匹配,性能上表现会稍好一些

ORM框架层实现

在ORM框架层实现sharding有两个方向,一个是在实现O-R Mapping的前提下同时提供sharding支持,从而定位为一种分布式的数据访问框架,这一类类型的框架代表就是guzz另一个方向是通过对既有ORM框架进行修改增强来加入sharding机制。此类型的代表产品是hibernate shard. 应该说以hibernate这样主流的地位,行业对于一款面向hibernate的sharding框架的需求是非常迫切的,但是就目前的hibernate shards来看,表现还算不上令人满意,主要是它对使用hibernate的限制过多,比如它对HQL的支持就非常有限。在mybatis方面,目前还没有成熟的相关框架产生。

有人提出利用mybatis的插件机制实现sharding,但是遗憾的是,mybatis的插件机制控制不到多数据源的连接层面,另一方面,离开插件层又失去了对sql进行集中解析和路由的机会,因此在mybatis框架上,目前还没有可供借鉴的框架,团队可能要在DAO层或Spring模板类上下功夫了。

JDBC API层实现

JDBC API层是很多人都会想到的一个实现sharding的绝佳场所,如果我们能提供一个实现了sharding逻辑的JDBC API实现,那么sharding对于整个应用程序来说就是完全透明的,而这样的实现可以直接作为通用的sharding产品了。但是这种方案的技术门槛和工作量显然不是一般团队能做得来的,因此基本上没有团队会在这一层面上实现sharding,甚至也没有此类的开源产品。笔者知道的只有一款商业产品dbShards采用的是这一方案。

介于DAO与JDBC之间的Spring数据访问封装层实现

在spring大行其道的今天,几乎没有哪个Java平台上构建的应用不使用spring,在DAO与JDBC之间,spring提供了各种template来管理资源的创建与释放以及与事务的同步,大多数基于spring的应用都会使用template类做为数据访问的入口,这给了我们另一个嵌入sharding逻辑的机会,就是通过提供一个嵌入了sharding逻辑的template类来完成sharding工作.这一方案在效果上与基于JDBC API实现的方案基本一致,同样是对上层代码透明,在进行sharding改造时可以平滑地过度,但它的实现却比基于JDBC API的方式简单,因此成为了不少框架的选择,阿里集团研究院开源的Cobar Client就是这类方案的一种实现。

介于应用服务器与数据库之间的代理实现

在应用服务器与数据库之间加入一个代理,应用程序向数据发出的数据请求会先通过代理,代理会根据配置的路由规则,对SQL进行解析后路由到目标shard,

因为这种方案对应用程序完全透明,通用性好,所以成为了很多sharding产品的选择。在这方面较为知名的产品是MySQL官方的代理工具:Mysql Proxy和一款

国人开发的产品:amoeba。mysql proxy本身并没有实现任何sharding逻辑,它只是作为一种面向mysql数据库的代理,给开发人员提供了一个嵌入sharding逻

辑的场所,它使用lua作为编程语言,这对很多团队来说是需要考虑的一个问题。amoeba则是专门实现读写分离与sharding的代理产品,它使用非常简单,不

使用任何编程语言,只需要通过xml进行配置。不过amoeba不支持事务(从应用程序发出的包含事务信息的请求到达amoeba时,事务信息会被抹去,因此,即

使是单点数据访问也不会有事务存在)一直是个硬伤。当然,这要看产品的定位和设计理念,我们只能说对于那些对事务要求非常高的系统,amoeba是不适合的。


样例一:Mybatis + 分库分表插件

使用优秀的开源插件,好处是在获得分库分表能力的基础上,还有额外的功能,例如:读写分离、事务优化等。


基础流程:

1、根据mapper xml生成sql

由于重写了methodProxy,可以在不依赖于sqlSession的情况下根据mapper xml生成待执行的sql语句。

2、sql 解析

利用mybatis自身的api获取分表字段的值

3、sql路由

根据分表字段的值取模,找到对应的数据源

4、到指定的数据源执行sql

此时才根据数据源生成sqlSession,然后执行响应的语句。


样例二:Spring 多数据源分库分表

Spring 2.0.1以后的版本已经支持配置多数据源,通过继承AbstractRoutingDataSource可以是实现多数据源的动态转换,即运行的时候动态加载不同的数据源。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值