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

【Mycat1.6之分页代码源码研究】

 
阅读更多

使用Mycat感触最深的是:有了Mycat后端都是Mysql数据库了,对外屏蔽了数据库底层,你压根不知道后端使用的啥数据库,甚至是分页你按照Mysql的Limit语法传递参数就没有问题,因为后端的PageSQLUtil会自动包装转换.........


 



 

 

PageSQLUtil类目前兼容ORACLE、SQL_SERVER、DB2、POSTGRESQL、MYSQL分页。

public class PageSQLUtil

{

    public static String convertLimitToNativePageSql(String dbType, String sql,

                                  int offset, int count)

    {

        if (JdbcConstants.ORACLE.equalsIgnoreCase(dbType))

        {

            OracleStatementParser oracleParser = new OracleStatementParser(sql);

            SQLSelectStatement oracleStmt = (SQLSelectStatement) oracleParser.parseStatement();

            return PagerUtils.limit(oracleStmt.getSelect(), JdbcConstants.ORACLE, offset, count);

        } else if (JdbcConstants.SQL_SERVER.equalsIgnoreCase(dbType))

        {

            SQLServerStatementParser oracleParser = new SQLServerStatementParser(sql);

            SQLSelectStatement sqlserverStmt = (SQLSelectStatement) oracleParser.parseStatement();

            SQLSelect select = sqlserverStmt.getSelect();

            SQLOrderBy orderBy=  select.getOrderBy() ;

            if(orderBy==null)

            {

                SQLSelectQuery sqlSelectQuery= select.getQuery();

                if(sqlSelectQuery instanceof SQLServerSelectQueryBlock)

                {

                        SQLServerSelectQueryBlock sqlServerSelectQueryBlock= (SQLServerSelectQueryBlock) sqlSelectQuery;

                    SQLTableSource from=       sqlServerSelectQueryBlock.getFrom();

                    if("limit".equalsIgnoreCase(from.getAlias()))

                    {

                        from.setAlias(null);

                    }

                }

                SQLOrderBy newOrderBy=new SQLOrderBy(new SQLIdentifierExpr("(select 0)"));

                select.setOrderBy(newOrderBy);

            }

            return PagerUtils.limit(select, JdbcConstants.SQL_SERVER, offset, count)  ;

        }

        else if (JdbcConstants.DB2.equalsIgnoreCase(dbType))

        {

            DB2StatementParser db2Parser = new DB2StatementParser(sql);

            SQLSelectStatement db2Stmt = (SQLSelectStatement) db2Parser.parseStatement();

            //注意此处没有调用PagerUtils类中的方法,也许PagerUtils中的limitDB2这个方法有bug

            //因为PagerUtils 来自druid-1.0.26包中的com.alibaba.druid.sql.PagerUtils 

            return limitDB2(db2Stmt.getSelect(), JdbcConstants.DB2, offset, count);

        }  else if (JdbcConstants.POSTGRESQL.equalsIgnoreCase(dbType))

        {

            PGSQLStatementParser pgParser = new PGSQLStatementParser(sql);

            SQLSelectStatement pgStmt = (SQLSelectStatement) pgParser.parseStatement();

            SQLSelect select = pgStmt.getSelect();

            SQLSelectQuery query= select.getQuery();

            if(query instanceof PGSelectQueryBlock)

            {

                PGSelectQueryBlock pgSelectQueryBlock= (PGSelectQueryBlock) query;

                pgSelectQueryBlock.setOffset(null);

                pgSelectQueryBlock.setLimit(null);

 

            }

            return PagerUtils.limit(select, JdbcConstants.POSTGRESQL, offset, count);

        }  else if (JdbcConstants.MYSQL.equalsIgnoreCase(dbType))

        {

            MySqlStatementParser pgParser = new MySqlStatementParser(sql);

            SQLSelectStatement pgStmt = (SQLSelectStatement) pgParser.parseStatement();

            SQLSelect select = pgStmt.getSelect();

            SQLSelectQuery query= select.getQuery();

            if(query instanceof MySqlSelectQueryBlock)

            {

                MySqlSelectQueryBlock pgSelectQueryBlock= (MySqlSelectQueryBlock) query;

                pgSelectQueryBlock.setLimit(null);

            }

            return PagerUtils.limit(select, JdbcConstants.MYSQL, offset, count);

        }

        return sql;

    }

 



 

 



 

原创不易,欢迎打赏,请认准正确地址,谨防假冒



 

 


附件:实验代码

EXPLAIN select * from dept limit 4,3

truncate table dept

INSERT into dept(uuid,id,address) values(1,1,'北京');

INSERT into dept(uuid,id,address) values(2,2,'上海');

INSERT into dept(uuid,id,address) values(3,3,'深圳');

 

 

INSERT into dept(uuid,id,address) values(4,4,'广州');

INSERT into dept(uuid,id,address) values(5,5,'天津');

INSERT into dept(uuid,id,address) values(6,6,'杭州');

INSERT into dept(uuid,id,address) values(7,7,'南京');

INSERT into dept(uuid,id,address) values(8,8,'济南');

INSERT into dept(uuid,id,address) values(9,9,'重庆');

INSERT into dept(uuid,id,address) values(10,10,'青岛');

INSERT into dept(uuid,id,address) values(11,11,'大连');

INSERT into dept(uuid,id,address) values(12,12,'宁波');

INSERT into dept(uuid,id,address) values(13,13,'厦门');

INSERT into dept(uuid,id,address) values(14,14,'成都');

INSERT into dept(uuid,id,address) values(15,15,'武汉');

INSERT into dept(uuid,id,address) values(16,16,'哈尔滨');

INSERT into dept(uuid,id,address) values(17,17,'沈阳');

INSERT into dept(uuid,id,address) values(18,18,'西安');

INSERT into dept(uuid,id,address) values(19,19,'长春');

INSERT into dept(uuid,id,address) values(20,20,'长沙');

INSERT into dept(uuid,id,address) values(21,21,'福州');

INSERT into dept(uuid,id,address) values(22,22,'郑州');

INSERT into dept(uuid,id,address) values(23,23,'石家庄');

INSERT into dept(uuid,id,address) values(24,24,'苏州');

INSERT into dept(uuid,id,address) values(25,25,'佛山');

INSERT into dept(uuid,id,address) values(26,26,'东莞');

INSERT into dept(uuid,id,address) values(27,27,'无锡');

INSERT into dept(uuid,id,address) values(28,28,'烟台');

INSERT into dept(uuid,id,address) values(29,29,'太原');

  • 大小: 69.8 KB
  • 大小: 98.9 KB
  • 大小: 134.8 KB
  • 大小: 140.1 KB
0
2
分享到:
评论

相关推荐

    Mycat1.6源码

    通过深入研究Mycat 1.6的源码,不仅可以理解其工作原理,还能为实际项目中的问题定位和性能调优提供指导。对于想要涉足分布式数据库领域的开发者来说,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是其运行的前提。 首先,让我们...

    mycat1.6jar包反编译的源码

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

    mycat 1.6 win和linux版

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

    Mycat1.6 安装步骤

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

    mycat-1.6.7.6_BYMONTH.zip

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

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

    深入研究Mycat-Server 1.6的源码,可以帮助开发者理解其内部机制,比如连接管理、SQL解析、事务处理、负载均衡等模块。源码阅读有助于定制化开发和优化性能,例如针对特定业务场景调整分片策略,或者改进SQL执行效率...

    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

    6. **扩展性**:Mycat设计时考虑了良好的扩展性,随着业务的增长,可以轻松添加新的数据节点,无需改动应用层代码。 在实际应用中,我们还需要关注Mycat的日志配置、性能监控、异常处理等方面,确保系统的稳定运行...

    mycat1.6.7.4

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

    Mycat-Server-1.6(源码)

    《深入解析Mycat-Server-1.6源码》 Mycat是开源的分布式数据库中间件,它主要用于解决大数据环境下数据分片、...因此,对于有志于在大数据领域深入研究的开发者来说,掌握Mycat-Server-1.6的源码是必不可少的一步。

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

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

    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'

    2. **源码修改**:如果Mycat的源码中直接使用了`query_cache_size`,则需要找到对应的代码行并进行修改或删除。这可能涉及到对Mycat的源码有一定理解,或者查看官方文档和社区讨论来找到正确的修改方法。 3. **配置...

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

    4. "Mycat-server-1.6.7.6-release-sources.jar":这是Mycat的源代码jar包,对于开发者来说,这是一个非常宝贵的资源,可以通过查看源代码了解Mycat的工作原理和实现细节。 安装和配置Mycat时,需要修改相应的配置...

    mycat1.6jar包

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

Global site tag (gtag.js) - Google Analytics