本发明属于通信领域,特别涉及一种MySQL数据库中间件预处理方法。

(二)

背景技术:

通常来说,MySQL集群和应用程序之间需要通过一个中间件来实现通信。中间件的作用是,对于应用程序来说,不需要关心数据库是单机数据库还是集群数据库,只通过中间件来访问数据库,无需变动代码,也不受数据库集群架构变动的影响;对于数据库集群来说,可以自由的进行负载均衡的分配,灵活的调整架构设计,集群中某一台数据库宕机也不会影响正常服务。中间件起到的就是一种代理、转发、中继的作用,使得应用程序和数据库集群都可以各自灵活变动而不影响对方。

应用程序访问数据库是通过SQL(结构化查询)语言来进行数据的增、删、改、查等操作。而中间件要想对应用程序透明,就必须妥善处理所有的SQL语言。由于中间件后端的数据库通常都有主库从库之分,主库可读可写,从库一般来说只读(如果在从库上写会造成从库和主库数据不一致)。所以哪些SQL语句在主库上执行,哪些SQL语句在从库上执行,都需要中间件来做出正确的判断,既不能造成主库从库的数据不一致,影响正常业务逻辑,也需要尽量做到负载的均衡,提高服务执行效率。

中间件在执行命令时需要进行预处理,预处理技术是一种常用的数据库查询技术,它先将要查询语句的结构发送到数据库中,数据库分析、编译、优化这条语句,然后在将需要查询的条件参数发送到数据库,由数据库执行并返回结果。由于可以一次解析多次执行,预处理可以提高查询效率;同时,参数设置和SQL语句解析分开,也可以避免SQL注入(一种网络攻击行为)的风险,提高系统整体的安全性。

预处理大概分下面几个步骤来进行:

1. 预备语句,分析、优化语句

2. 设置变量,绑定参数

3. 执行完整的语句

4. 删除预备语句。

然而,中间件处理预处理的难点在于,预处理是基于数据库连接而存在的。同一数据库的不同连接,一个连接的预备语句对另一个连接也是不可见的;另外一点就是预处理是分步骤执行的,中间件无法区分哪个步骤应该在哪个连接上执行。结合上面说的,对于读和写的预处理语句也需要分别在主库从库上加以区分。这样就给中间件带来的很大的困难。

通常中间件有以下几种处理方法:

1. 缓存预备语句,待收到变量绑定之后,组成完整的SQL语句发往后端数据库执行。这中做法完全抹杀了预处理的优势,既不能提高效率,又无法防止SQL注入的风险;但是这种方法虽然简单粗暴,但是在负载均衡和数据一致性方面不容易产生问题。

2. 只在主库执行预处理。这样可以保持预处理的优势,但是会增大主库的负担,降低中间件的作用,降低了系统的运行效率,也是对从库资源的一种浪费,因为一般来说数据库都是查询多修改少。

3. 将预备语句和绑定参数发往所有的后端服务器执行。这种做法只适用于后端服务器都是主库(都可写入)的情况,不适用于一般的主从架构。

(三)

技术实现要素:

本发明为了弥补现有技术的不足,提供了一种MySQL数据库中间件预处理方法。

本发明是通过如下技术方案实现的:

一种MySQL数据库中间件预处理方法,其特征在于:

S1:中间件将应用程序发送的预备语句进行整理修剪后取哈希值,并形成预备语句哈希表,同样的预备语句对应一个哈希值;

S2:中间件将哈希值发送给应用程序,应用程序需将获取到的哈希值和需要绑定的参数同时发送给中间件;

S3:中间件收到应用程序发送的哈希值和绑定参数时,通过哈希值查询到对应的预备语句和操作类型,并替换上一次的绑定参数;

S4:中间件再次将哈希值返回应用程序,应用程序发送收到的哈希值和执行命令;

中间件根据不同负载均衡策略,将最近保留的参数发送的对应的后端MySQL服务器上执行,获取结果,中间件将结果返回给应用程序。

其中,S1中,中间件接受预备语句后,先检查预备语句哈希表中是否具有同样的语句;如果有直接使用,如果没有将预备语句哈希表中插入新的预备语句和对应的哈希值。

其中,所述新的预备语句根据操作类型发往所有的后端MySQL数据库进行准备。

其中,所述通过中间件对预备语句的分析,得出语句的操作类型。

其中,S3中,中间件保留上一次应用程序的绑定参数,应用程序在执行同一个参数同一个查询时可在后端进行负载均衡的查询,无需让应用程序再次传递参数。

本发明的有益效果是:

1.对于预处理的支持更加全面,本发明完整的在中间件层面实现了全部的预处理功能,对于应用程序来说和直接连接MySQL数据库使用几乎没有任何差别

2.由于对预处理的全面支持,所以本发明可以通过预处理来提高效率,防止SQL注入,提高安全性

3.本方法可以更高效的实现后端MySQL数据库的负载均衡,支持各种负载均衡的策略,提高系统查询效率

4.本方法可以最大程度上实现读写分离,降低主库负载

5.本方法占用系统资源非常小,方便灵活部署在各种类型的服务器上

(四)附图说明

下面结合附图对本发明作进一步的说明。

图1为本发明的结构流程图。

(五)具体实施方式

本发明

S1:中间件将应用程序发送的预备语句进行整理修剪后取哈希值,并形成预备语句哈希表,同样的预备语句对应一个哈希值;

S2:中间件将哈希值发送给应用程序,应用程序需将获取到的哈希值和需要绑定的参数同时发送给中间件;

S3:中间件收到应用程序发送的哈希值和绑定参数时,通过哈希值查询到对应的预备语句和操作类型,并替换上一次的绑定参数;

S4:中间件再次将哈希值返回应用程序,应用程序发送收到的哈希值和执行命令;

中间件根据不同负载均衡策略,将最近保留的参数发送的对应的后端MySQL服务器上执行,获取结果,中间件将结果返回给应用程序。

其中,S1中,中间件接受预备语句后,先检查预备语句哈希表中是否具有同样的语句;如果有直接使用,如果没有将预备语句哈希表中插入新的预备语句和对应的哈希值。

结合说明书附图具体阐述为:

1、应用程序先将预备语句发往中间件;

2、中间件对预备语句进行整理修剪后取哈希值,此处整理修剪为本领域技术术语,指对语句内的空格、符号等进行删除或整理操作;预备语句与哈希值是一一对应的关系,相同的预备语句只对应一个哈希值;

3、当应用程序发送一条新的预备语句时,如果该预备语句没有对应的哈希值时,中间件将存储新的哈希值和对应的预备语句,然后中间件将新的预备语句根据操作类型发往所有的后端MySQL数据库进行准备;其中中间件通过对预备语句的分析,得出语句的操作类型,比如SELECT是查询类型,INSERT、UPDATE、DELETE、CREATE、DROP、ALTER等是写入类型,区分之后写入操作发往主库,查询操作发往所有从库;此处中间件对预备语句的分析属于现有技术,此处不再赘述;当应用程序发送的预备语句已经存在于中间件中时,中间件直接使用相应的哈希值;

4、中间件将第二步中的哈希值发送给应用程序;

5、在绑定参数时,应用程序需将获取到的哈希值和需要绑定的参数同时发送给中间件,参数为中间件可读取的字符串;

6、中间件在收到应用程序发送的哈希值和绑定参数时,通过哈希值查询到对应的预备语句和操作类型,并替换上一次的绑定参数;

7、中间件再次将哈希值返回给应用程序,表示所有准备工作都已经就绪,可以执行SQL语句了;

8、应用程序发送执行命令,并发送上一步收到的哈希值;

9、中间件根据不同负载均衡策略,将最近保留的参数发送的对应的后端MySQL服务器上执行,获取结果;

10、中间件将结果返回给应用程序。

本发明中:

1.同样的预备语句只会保留一个。对原始的预备语句进行整理修剪之后的字符串取哈希值,由于同样的字符串哈希值是相同的,所以无论应用程序发过来多少预备语句,都会只有一个副本,显著降低了发往后端数据库的预备语句的数量,降低后端数据库负载。

2.通过对预备语句的分析,得出语句的操作类型,比如SELECT是查询类型,INSERT、UPDATE、DELETE、CREATE、DROP、ALTER等是写入类型,区分之后再执行语句的时候,就可以把查询在所有从库上进行负载均衡,把写入操作放到主库上执行,避免了数据不一致。

3.保留上一次应用程序的绑定参数,可以方便应用程序在执行同一个参数同一个查询时也可以在后端进行负载均衡的查询,无需让应用程序再次传递参数。

上面以举例方式对本发明进行了说明,但本发明不限于上述具体实施例,凡基于本发明所做的任何改动或变型均属于本发明要求保护的范围。