为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:V8.0
【操作系统】:Windows 11 专业版
【CPU】:
【问题描述】*:达梦整合sharding-jdbc分表做分页数据查询的时候,返回的结果跟预期的不一样。2个分表,goods_1和goods_2,期待是返回整合后的10条。用limit做分页实际返回的是每个表各10条,总共20条,没做二次筛选汇聚。改成用Page对象,返回的是全量的,那个页码数值没起作用。把数据库和驱动改成mysql8.0可以返回正确结果。
java代码如下:
void getGoodPage(){
// Page<Goods> page = new Page(1, 10);
QueryWrapper<Goods> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByAsc("gid");
queryWrapper.last("limit 10");
List
// List<Goods> goodsList = goodPage.getRecords();
System.out.println("-----------" + goodsList.size() + "------------");
for (Goods goods : goodsList){
System.out.println("goods id : " + goods.getGid() + ", goods name : " + goods.getGname());
}
}
达梦数据库与Sharding-JDBC整合分页查询异常问题,可通过以下方案解决:
1. 分页机制差异
达梦对LIMIT的处理逻辑与MySQL不同,在分片场景下会先对各分表执行LIMIT 10,再合并结果集导致返回20条。需改用Sharding-JDBC的内存分页模式强制二次归并:
// 启用内存分页归并 HintManager.getInstance().setShardingHintModeValue(HintProperties.SHARDING_HINT_MODE_KEY, "MEMORY_MERGE");
2. PageHelper适配方案
达梦需显式配置分页插件方言,并确保使用PageHelper.startPage而非原生LIMIT:
# application.yml配置 pagehelper: helper-dialect: dm reasonable: true support-methods-arguments: true
3.Sharding-JDBC版本兼容性
达梦需使用5.3.0+版本的ShardingSphere,其内置达梦方言优化分页归并逻辑69。检查依赖版本:
<dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>5.3.1</version> </dependency>
完整修正代码示例
结合内存分页与排序优化:
GoodsService.java
void getGoodPage() { try (HintManager hintManager = HintManager.getInstance()) { hintManager.setShardingHintModeValue("MEMORY_MERGE"); PageHelper.startPage(1, 10); // 页码从1开始 QueryWrapper<Goods> wrapper = new QueryWrapper<Goods>().orderByAsc("gid"); List<Goods> list = goodsMapper.selectList(wrapper); PageInfo<Goods> pageInfo = new PageInfo<>(list); System.out.println("实际返回数量:" + pageInfo.getSize()); } }
通过HintManager强制内存归并,配合PageHelper实现正确分页。
关键注意事项: