环境,操作系统:win11,数据库pgsql16。
测试工具:oha。
测试内容:做1000的并发,将单张100万行的数据表,分页取数,取前两页数据返回给前端。
Java spring boot 使用OpenJDK21,代码如下:
package com.example.demo.service;
import com.example.demo.entity.Tb1;
import com.example.demo.repository.Tb1Repository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class Tb1Service {
@Autowired
private Tb1Repository tb1Repository;
/**
* 获取前两页的数据,每页的大小由pageSize决定
*
* @param pageSize 每页记录数
* @return 前两页的数据列表
*/
public List<Tb1> getFirstTwoPages(int pageSize) {
List<Tb1> result = new ArrayList<>();
Pageable firstPage = PageRequest.of(0, pageSize);
Pageable secondPage = PageRequest.of(1, pageSize);
tb1Repository.findAll(firstPage).forEach(result::add);
tb1Repository.findAll(secondPage).forEach(result::add);
return result;
}
}
测试结果:
c# asp.net core使用的.net8,代码如下:
public async Task<ActionResult<IEnumerable<Tb1>>> GetTb1s(int pageSize = 5)
{
// 第一次查询:获取第一页记录
var firstPageQuery = _context.Tb1s
.AsNoTracking();
var firstPage = await firstPageQuery
.OrderBy(x => x.Id) // 假设有一个名为Id的列用于排序
.Skip(0)
.Take(pageSize)
.ToListAsync();
// 第二次查询:获取第二页记录
var secondPageQuery = _context.Tb1s
.AsNoTracking();
var secondPage = await secondPageQuery
.OrderBy(x => x.Id)
.Skip(pageSize)
.Take(pageSize)
.ToListAsync();
// 合并第一页和第二页的结果
var combinedResult = firstPage.Concat(secondPage).ToList();
// 返回合并结果以 JSON 格式给前端
return Ok(combinedResult);
}
测试结果:
从测试结果上看,spring boot花了93秒,而 asp.net core只用了1.5秒,c#在这个场景比Java快了62倍。