使用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,'太原');
相关推荐
通过深入研究Mycat 1.6的源码,不仅可以理解其工作原理,还能为实际项目中的问题定位和性能调优提供指导。对于想要涉足分布式数据库领域的开发者来说,Mycat 1.6源码无疑是一份宝贵的参考资料。
《Mycat 1.6 稳定版在Linux环境下的部署与应用》 Mycat是一款开源的、基于Java开发的分布式数据库中间件,主要用于解决大数据量、高并发场景下的数据库处理问题。它实现了MySQL协议,可以作为MySQL的一个高性能、高...
mycat1.6windows+linux.zip, 我就很不理解,为什么好多人上传的资料,下载都需要积分。0积分能咋地?官网能访问但是下载不了,后再巧合下在另外一个网站上下载的,我在这里给大家分享下。不需要积分也不需要花钱,...
【Mycat1.6与SQLServer操作案例详解】 Mycat是一款开源的分布式数据库中间件,它在大型分布式系统中扮演着数据库分片的角色,能够有效地解决单个数据库性能瓶颈的问题。Mycat 1.6是其一个重要版本,提供了更稳定、...
《Mycat数据库中间件详解——基于mycat1.6.7.1版本》 Mycat是一款开源的、基于Java开发的分布式数据库中间件,主要用于解决大数据量、高并发的分布式数据库架构问题。在本篇文章中,我们将深入探讨mycat1.6.7.1版本...
在本压缩包"mycat1.6.7.5.zip"中,包含了在Linux环境下安装Mycat 1.6.7.5所需的所有关键组件,尤其是Java Development Kit (JDK) 1.8的安装文件,因为Mycat运行在Java平台上,所以JDK是其运行的前提。 首先,让我们...
《深入解析mycat1.6源码:一次技术探索之旅》 Mycat,作为一款开源的分布式数据库中间件,广泛应用于大型分布式系统中,它实现了数据分片、读写分离、故障切换等功能,为高并发、大数据量的场景提供了优秀的解决...
2. **分库分表**:Mycat的核心功能之一就是实现数据库的横向扩展,通过分库分表策略,将大表拆分成多个小表,分布在不同的数据库实例上,提高数据读写性能。 3. **SQL路由**:Mycat支持自定义SQL解析规则,可以根据...
### Mycat 1.6 安装步骤详解 #### 一、Mycat简介与应用场景 Mycat作为一款开源的数据库中间件,主要用于解决大型系统中的数据分库分表问题,通过它能够将大量的数据分散到多个物理数据库中,以此来提升系统的并发...
基于MyCat1.6.7.6正式版的源码修改的,支持subTables的按月分表正则配置 subTables=“ tableName_$202101-?” subTableWay="BYMONTH" rule="sharding-by-month" 表示从202101月份开始进行分表处理,?表示当前日期的...
深入研究Mycat-Server 1.6的源码,可以帮助开发者理解其内部机制,比如连接管理、SQL解析、事务处理、负载均衡等模块。源码阅读有助于定制化开发和优化性能,例如针对特定业务场景调整分片策略,或者改进SQL执行效率...
《Mycat 1.6权威指南》与《Mycat 1.5权威指南》是两本关于Mycat数据库中间件的重要参考资料,分别提供了详细的1.6和1.5版本的技术信息和实践指导。Mycat作为一款开源的分布式数据库系统,它解决了大数据量下的高并发...
6. **扩展性**:Mycat设计时考虑了良好的扩展性,随着业务的增长,可以轻松添加新的数据节点,无需改动应用层代码。 在实际应用中,我们还需要关注Mycat的日志配置、性能监控、异常处理等方面,确保系统的稳定运行...
【Mycat1.6.7.4:数据库中间件详解】 Mycat,作为一款强大的数据库中间件,它的出现是对阿里巴巴开源项目Cobar的一次革新与超越。Cobar是MySQL集群的一种解决方案,但随着时间的发展,社区发现它存在一些局限性,...
《深入解析Mycat-Server-1.6源码》 Mycat是开源的分布式数据库中间件,它主要用于解决大数据环境下数据分片、...因此,对于有志于在大数据领域深入研究的开发者来说,掌握Mycat-Server-1.6的源码是必不可少的一步。
在本压缩包中,我们获得了Mycat 1.6.7.5的Windows版本,这是一款专为Windows环境设计的程序,用于在MySQL数据库上构建高效的数据处理架构。 **Mycat核心特性:** 1. **读写分离**:Mycat可以自动将读操作路由到从...
本篇文章将详细介绍如何在Linux环境下安装Mycat的1.6.7.4版本。 首先,了解Mycat的基本概念。Mycat是基于Java开发的,它的主要功能包括数据分片、读写分离、故障切换以及SQL路由等。通过数据分片,Mycat可以将大...
2. **源码修改**:如果Mycat的源码中直接使用了`query_cache_size`,则需要找到对应的代码行并进行修改或删除。这可能涉及到对Mycat的源码有一定理解,或者查看官方文档和社区讨论来找到正确的修改方法。 3. **配置...
4. "Mycat-server-1.6.7.6-release-sources.jar":这是Mycat的源代码jar包,对于开发者来说,这是一个非常宝贵的资源,可以通过查看源代码了解Mycat的工作原理和实现细节。 安装和配置Mycat时,需要修改相应的配置...
当mycat的jar包的版本过低时,替换这个可解决问题.