`
gaojingsong
  • 浏览: 1219571 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

【Mycat1.6之HintSQLHandler源码阅读】

阅读更多

 MyCat对自身不支持的Sql语句提供了一种解决方案——在要执行的SQL语句前添加额外的一段由注解SQL组织的代码,这样Sql就能正确执行,这段代码称之为“注解”。注解的使用相当于对mycat不支持的sql语句做了一层透明代理转发,直接交给目标的数据节点进行sql语句执行,其中注解SQL用于确定最终执行SQL的数据节点。注解的形式是:

/*!mycat: sql=注解Sql语句*/

注解的使用方式是:

/*!mycat: sql=注解Sql语句*/真正执行Sql

 

一、原理介绍: 

MyCat执行SQL语句的流程是先进行SQL解析处理,解析出分片信息(路由信息)后,然后到该分片对应的物理库上去执行;若传入的SQL语句MyCat无法解析,则MyCat不会去执行;而注解则是告诉MyCat按照注解内的SQL(称之为注解SQL)去进行解析处理,解析出分片信息后,将注解后真正要执行的SQL语句(称之为原始SQL)发送到该分片对应的物理库上去执行。 

从上面的原理可以看到,注解只是告诉MyCat到何处去执行原始SQL;因而使用注解前,要清楚的知道该原始SQL去哪个分片执行,然后在注解SQL中也指向该分片,这样才能使用!例子中的sharding_id=10010 即是指明分片信息的。 

需要说明的是,若注解SQL没有能明确到具体某个分片,譬如例子中的注解SQL没有添加sharding_id=10010这个条件,则MyCat会将原始SQL发送到persons表所在的所有分片上去执行去,这样造成的后果若是插入语句,则在多个分片上都存在重复记录,同样查询、更新、删除操作也会得到错误的结果!

 

 二、继承关系

HintHandler 有五个子类,HintCatletHandler、HintDataNodeHandler、HintMasterDBHandler、HintSchemaHandler、HintSQLHandler

/**

 * 按照注释中包含指定类型的内容做路由解析

 * 

 */

public interface HintHandler {

 

public RouteResultset route(SystemConfig sysConfig, SchemaConfig schema,

                                int sqlType, String realSQL, String charset, 

ServerConnection sc,LayerCachePool cachePool, 

String hintSQLValue, int hintSqlType, Map hintMap)throws SQLNonTransientException;

--这个方法参数有点多,不够友好

}



 

/**

 * 处理注释中 类型为sql的情况 (按照 注释中的sql做路由解析,而不是实际的sql)

 */

public class HintSQLHandler implements HintHandler {}

 

/**

 * 处理注释中类型为schema 的情况(按照指定schema做路由解析)

 */

public class HintSchemaHandler implements HintHandler{}

 

/**

 * 处理情况 sql hint: mycat:db_type=master/slave<br/>

 * 后期可能会考虑增加 mycat:db_type=slave_newest,实现走延迟最小的slave

 * @author digdeep@126.com

 */

// /*#mycat:db_type=master*/

// /*#mycat:db_type=slave*/

// /*#mycat:db_type=slave_newest*/

// 强制走 master 和 强制走 slave

public class HintMasterDBHandler implements HintHandler {}

 

/**

 * 处理注释中类型为datanode 的情况

 * 

 * @author zhuam

 */

public class HintDataNodeHandler implements HintHandler{}

 

/**

 * 处理注释中类型为catlet 的情况,每个catlet为一个用户自定义Java代码类,用于进行复杂查询SQL(只能是查询SQL)的自定义执行过程,

 * 目前主要用于跨分片Join的人工智能编码

 */

public class HintCatletHandler implements HintHandler {}

 

 

三、应用示例

 

/*#mycat:db_type=master*/ select * from travelrecord

 

 

 

/*!mycat: sql=select 1 from test */create table test2(id int);

如select 1 from 表,注解内语句查出来的数据在哪个分片,数据在那个节点往哪个节点建. 

 

 

 

配置了Mycat读写分离后,默认查询都会从读节点获取数据,但是有些场景需要获取实时数据,如果从读节点获取数据可能因延时而无法实现实时,Mycat支持通过注解/balance/来强制从写节点查询数据:

a. 事务内的SQL,默认走写节点,以注解/*balance*/开头,则会根据schema.xml的dataHost标签属性的balance=“1”或“2”去获取节点 

b. 非事务内的SQL,开启读写分离默认根据balance=“1”或“2”去获取,以注解/*balance*/开头则会走写节点解决部分已经开启读写分离,但是需要强一致性数据实时获取的场景走写节点

 /*balance*/ select a.* from customer a where a.company_id=1;

 

 

 

多租户支持 

通过注解方式在配置多个schema情况下,指定走哪个配置的schema。 

web部分修改: a.在用户登录时,在线程变量(ThreadLocal)中记录租户的id b.修改jdbc的实现:在提交sql时,从ThreadLocal中获取租户id, 添加sql 注释,把租户的schema 放到注释中。例如:/!mycat : schema = test_01 / sql ; 

在db前面建立proxy层,代理所有web过来的数据库请求。proxy层是用mycat实现的,web提交的sql过来时在注释中指定schema, proxy层根据指定的schema转发sql请求。

 /*!mycat : schema = test_01 */ sql ;

 

 

 多表

 ShareJoin /*!mycat:catlet=demo.catlets.ShareJoin */ select a.*,b.id, b.name as tit from customer a,company b on a.company_id=b.id;

 

 

  • 大小: 69.1 KB
0
2
分享到:
评论

相关推荐

    Mycat1.6源码

    《深入剖析Mycat 1.6源码》 Mycat是一款开源的分布式数据库中间件,它在Java平台上运行,旨在解决大数据分布式存储和处理的问题。Mycat 1.6版本是其一个重要的里程碑,它在前一版本的基础上进行了一系列的优化和...

    Mycat 1.6 稳定版-linux环境 gz包.7z

    《Mycat 1.6 稳定版在Linux环境下的部署与应用》 Mycat是一款开源的、基于Java开发的分布式数据库中间件,主要用于解决大数据量、高并发场景下的数据库处理问题。它实现了MySQL协议,可以作为MySQL的一个高性能、高...

    mycat1.6windows+linux.zip

    mycat1.6windows+linux.zip, 我就很不理解,为什么好多人上传的资料,下载都需要积分。0积分能咋地?官网能访问但是下载不了,后再巧合下在另外一个网站上下载的,我在这里给大家分享下。不需要积分也不需要花钱,...

    【Mycat1.6之操作SQLServer案例】

    【Mycat1.6与SQLServer操作案例详解】 Mycat是一款开源的分布式数据库中间件,它在大型分布式系统中扮演着数据库分片的角色,能够有效地解决单个数据库性能瓶颈的问题。Mycat 1.6是其一个重要版本,提供了更稳定、...

    mycat1.6.7.1.rar

    《Mycat数据库中间件详解——基于mycat1.6.7.1版本》 Mycat是一款开源的、基于Java开发的分布式数据库中间件,主要用于解决大数据量、高并发的分布式数据库架构问题。在本篇文章中,我们将深入探讨mycat1.6.7.1版本...

    mycat1.6.7.5.zip

    在本压缩包"mycat1.6.7.5.zip"中,包含了在Linux环境下安装Mycat 1.6.7.5所需的所有关键组件,尤其是Java Development Kit (JDK) 1.8的安装文件,因为Mycat运行在Java平台上,所以JDK是其运行的前提。 首先,让我们...

    mycat 1.6 win和linux版

    2. **分库分表**:Mycat的核心功能之一就是实现数据库的横向扩展,通过分库分表策略,将大表拆分成多个小表,分布在不同的数据库实例上,提高数据读写性能。 3. **SQL路由**:Mycat支持自定义SQL解析规则,可以根据...

    mycat1.6jar包反编译的源码

    《深入解析mycat1.6源码:一次技术探索之旅》 Mycat,作为一款开源的分布式数据库中间件,广泛应用于大型分布式系统中,它实现了数据分片、读写分离、故障切换等功能,为高并发、大数据量的场景提供了优秀的解决...

    mycat-server 1.6 源码包 可直接运行

    源码阅读有助于定制化开发和优化性能,例如针对特定业务场景调整分片策略,或者改进SQL执行效率。 总的来说,Mycat-Server 1.6提供了强大的分布式数据库解决方案,并且源码的开放性使得开发者能深入了解其运作机制...

    mycat-1.6.7.6_BYMONTH.zip

    基于MyCat1.6.7.6正式版的源码修改的,支持subTables的按月分表正则配置 subTables=“ tableName_$202101-?” subTableWay="BYMONTH" rule="sharding-by-month" 表示从202101月份开始进行分表处理,?表示当前日期的...

    Mycat1.6 安装步骤

    ### Mycat 1.6 安装步骤详解 #### 一、Mycat简介与应用场景 Mycat作为一款开源的数据库中间件,主要用于解决大型系统中的数据分库分表问题,通过它能够将大量的数据分散到多个物理数据库中,以此来提升系统的并发...

    Mycat 1.6权威指南.pdf和1.5的word版

    《Mycat 1.6权威指南》与《Mycat 1.5权威指南》是两本关于Mycat数据库中间件的重要参考资料,分别提供了详细的1.6和1.5版本的技术信息和实践指导。Mycat作为一款开源的分布式数据库系统,它解决了大数据量下的高并发...

    Mycat-1.6.7.3.zip

    Mycat-1.6.7.3是其的一个版本,通过下载并解压此压缩包,我们可以深入理解Mycat的配置与运行。 首先,解压"Mycat-1.6.7.3.zip"后,我们能看到其主要的文件结构。其中,`conf`目录包含了一系列配置文件,如`schema....

    mycat1.6.7.4

    【Mycat1.6.7.4:数据库中间件详解】 Mycat,作为一款强大的数据库中间件,它的出现是对阿里巴巴开源项目Cobar的一次革新与超越。Cobar是MySQL集群的一种解决方案,但随着时间的发展,社区发现它存在一些局限性,...

    MySql 中间件 Mycat 1.6.7.5 - release- win.tar windows 程序

    在本压缩包中,我们获得了Mycat 1.6.7.5的Windows版本,这是一款专为Windows环境设计的程序,用于在MySQL数据库上构建高效的数据处理架构。 **Mycat核心特性:** 1. **读写分离**:Mycat可以自动将读操作路由到从...

    Mycat-Server-1.6(源码)

    同时,源码阅读也有助于提升数据库中间件的开发能力,对于分布式数据库系统的理解和实践有着深远的影响。因此,对于有志于在大数据领域深入研究的开发者来说,掌握Mycat-Server-1.6的源码是必不可少的一步。

    linux的Mycat安装包1.6.7.4版本

    本篇文章将详细介绍如何在Linux环境下安装Mycat的1.6.7.4版本。 首先,了解Mycat的基本概念。Mycat是基于Java开发的,它的主要功能包括数据分片、读写分离、故障切换以及SQL路由等。通过数据分片,Mycat可以将大...

    解决mycatJDBC8驱动连接Mycat1.6报错 Unknown system variable 'query_cache_size'

    标题中的问题涉及到的是在使用Mycat数据中间件时,尝试使用JDBC 8驱动连接到Mycat 1.6版本时遇到的一个错误:`Unknown system variable 'query_cache_size'`。这个问题出现的原因在于MySQL 8.0版本中移除了`query_...

    Mycat-server-1.6.7.6-release-windows-linux.rar

    在标题"Mycat-server-1.6.7.6-release-windows-linux.rar"中,我们可以看到这是Mycat的1.6.7.6版本服务器的发布包,同时提供了适用于Windows和Linux两种操作系统平台的安装包。这表明Mycat具有良好的跨平台特性,...

    mycat1.6jar包

    当mycat的jar包的版本过低时,替换这个可解决问题.

Global site tag (gtag.js) - Google Analytics