Skip to content

Latest commit

 

History

History
68 lines (45 loc) · 2.79 KB

2.04_hint.md

File metadata and controls

68 lines (45 loc) · 2.79 KB

2.4 注解/Hint

Hint, 即注解。 我们定义为:在要执行的SQL语句前添加额外的一段由注解组织的代码,这样SQL就能按照编写者的意图执行,这段代码称之为“注解”。
注解的作用如下:

  • 指定路由,比如强制读写分离。
  • 帮助dble支持一些不能实现的语句,如单节点内存储过程的创建和调用,如insert…select…;

原理解释:分布式环境下执行SQL语句的流程是先进行SQL解析处理,计算出路由信息后,然后到对应的物理库上去执行;若传入的SQL语句无法解析,则不会去执行。注解则可以告诉解析器按照注解内的SQL(称之为注解SQL)去进行解析处理,解析出路由信息后,将真正要执行的SQL语句(称之为原始SQL)发送到对应的物理库上去执行。

2.4.1 Hint语法

Hint语法有两种形式:

  1. /*!dble:type=....*/
  2. /*#dble:type=...*/
"/*#dble: */" for mybatis and "/*!dble: */"  for mysql

其中,type有4种值可选:datanote,db_type,schema,sql。每一种值的功能和形式详见各个部分的具体说明。

2.4.2 类型datanote

  1. 形式
    datanode=node
    其中,node为数据节点名(参见配置1.2 schemal.xml)。
  2. 功能
    为不方便路由或者不能路由的的语句指定具体的目的数据节点。

2.4.3 类型db_type

  1. 形式
    db_type=master或者db_type=slave
  2. 功能
    帮助实现正确的业务逻辑,强制读写分离。
  3. 注意事项
    delete, insert, replace, update, ddl语句不能使用db_type=slave进行注解。

2.4.4 类型schema

  1. 形式
    schema=dbx
    其中,dbx为数据库名(参见配置1.2 schemal.xml)。
  2. 功能
    依赖dbx的配置信息进行路由。

2.4.5 类型sql

  1. 形式
    sql=sql_statement[,list_fields=field1,field2,...][,result_type=list ]
    其中,list_fields用于指定调用的存储过程的输出参数列表,fieldX为输出参数名。result_type=list指定结果是否为多行。
  2. 功能
    sql_statement的路由结果集作为实际sql语句的执行数据节点。支持存储过程。

2.4.6 注意事项

写注解需要注意如下事项:

  • 使用select语句作为注解SQL,不要使用delete/update/insert 等语句。 delete/update/insert 等语句虽然也能用在注解中,但这些语句在SQL处理中有一些额外的逻辑判断,会降低性能,不建议使用;
  • 注解SQL 禁用表关联语句;
  • 使用注解并不额外增加的执行时间;从解析复杂度以及性能考虑,注解SQL应尽量用最简单的SQL 语句,如select id from tab_a where id=’10000’;
  • 能不用注解也能够解决的场景,尽量不用注解。