为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:
【TiDB 版本】
5.7.25-TiDB-v4.0.10
【问题描述】
使用jdbc StreamResult的方式读取TiDB大表(总数3亿)中3kw+的记录(有等值索引)
mysql驱动:mysql-connector-java-8.0.18
关键代码如下:
//查询SQL
String sql="select belnr,buzei,bukrs,gjahr,sys_code,mandt,lessee_id,blart,budat,monat,cpudt,usnam,tcode,xblnr,stblg,stjah,bktxt,waers,kursf,bstat,awtyp,awkey,xstov,ppnam,kurst,augdt,augcp,augbl,bschl,koart,umskz,umsks,zumsk,shkzg,mwskz,dmbtr,wrbtr,pswbt,pswsl,zuonr,sgtxt,vbund,kokrs,kostl,anln1,anbwa,hkont,kunnr,lifnr,xopvw,zfbdt,zterm,zlsch,ebeln,ebelp,prctr,lokkt,geber,xref1,xref2,xref3,fkber,xnegp,kidno,auggj,agzei,fkber_long,bvtyp,hwaer,update_time from XXX where cpudt='20150703' and bukrs like 'A0%' order by belnr asc,buzei asc,bukrs asc,gjahr asc,sys_code asc,mandt asc,lessee_id asc"
//cpudt 是索引字段,order by的字段是一组联合主键
conn.setAutoCommit(false);
Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
return stmt.executeQuery(sql);
【异常如下】:
- 如果我不在url设置net_read_timeout 和 net_write_timeout (默认都是30)
执行query一段时间后出现The last packet successfully received from the server was 211,836 milliseconds ago错误 - 如果我在url中设置url=xxx/db?net_read_timeout=300&net_write_timeout=300后,程序执行query出现Packet for query is too large (5,526,600 > 65,535). You can change this value on the server by setting the ‘max_allowed_packet’ variable. 错误。
代码和sql是正常的,如果我把cpudt的条件改成其他数量小的查询,是可以正常执行并返回结果。并且程序已经验证过其他单次查询约400W记录的情况
请问是不是stream result对查询数据量由限制,并且限制由参数max_allowed_packet控制呢?
若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。