当前位置: 首页 > news >正文

mysql 大数据查询

基于 mysql 8.0

基础介绍

com.mysql.cj.protocol.ResultsetRows

该接口表示的是应用层如何访问 db 返回回来的结果集

它有三个实现类
在这里插入图片描述

ResultsetRowsStatic

默认实现。连接 db 的 url 没有增加额外的参数、单纯就是 ip port schema 。

@Test
public void generalQuery() throws Exception {String sql = "select * from test";ps = conn.prepareStatement(sql);ResultSet rs = ps.executeQuery(sql);int count = 0;while (rs.next()) {count++;}System.out.println(count);
}

那么这个时候、你的 ResultSet 对应的实现类里面的成员变量

com.mysql.cj.protocol.a.result.NativeResultset#rowData

的实现类就是 ResultsetRowsStatic

这个时候是最蠢的模式、因为 mysql 的驱动层只有接收完 db 所有数据才会返回到应用层。对应代码就是 ResultSet rs = ps.executeQuery(sql); 应用到线程会卡住在这里。直到驱动层返回。
假如表 test 中有 100w 数据、那么发生 OOM 到地方将会是 mysql 驱动层内部的代码、因为它自己将数据存起

	// 来源 com.mysql.cj.protocol.a.BinaryResultsetReader#readBinaryRowFactory brf = new BinaryRowFactory(this.protocol, cdef, resultSetFactory.getResultSetConcurrency(), false);ArrayList<ResultsetRow> rowList = new ArrayList<>();// 真正获取数据ResultsetRow row = this.protocol.read(ResultsetRow.class, brf);while (row != null) {if ((maxRows == -1) || (rowList.size() < maxRows)) {rowList.add(row);}row = this.protocol.read(ResultsetRow.class, brf);}rows = new ResultsetRowsStatic(rowList, cdef);// =============== 分割 ==========private List<Row> rows;@SuppressWarnings("unchecked")public ResultsetRowsStatic(List<? extends Row> rows, ColumnDefinition columnDefinition) {this.currentPositionInFetchedRows = -1;this.rows = (List<Row>) rows;this.metadata = columnDefinition;}

ResultsetRowsCursor

想要启用这种模式、需要在连接 db 的 url 中加上参数 useCursorFetch=true

jdbc:mysql://127.0.0.1:3306/test-db?useCursorFetch=true

并且对应的 fetchSize 要大于 0
我们看下源码 com.mysql.cj.jdbc.ConnectionImpl#prepareStatement(java.lang.String)
发现参数 int resultSetType, int resultSetConcurrency 默认值为

    private static final int DEFAULT_RESULT_SET_TYPE = ResultSet.TYPE_FORWARD_ONLY;private static final int DEFAULT_RESULT_SET_CONCURRENCY = ResultSet.CONCUR_READ_ONLY;

当我们设置了 useCursorFetch=true 之后、useServerPrepStmts 会被设置为 true
com.mysql.cj.jdbc.ConnectionImpl#ConnectionImpl(com.mysql.cj.conf.HostInfo)com.mysql.cj.conf.PropertySet#initializeProperties com.mysql.cj.jdbc.JdbcPropertySetImpl#postInitialization

     if (getBooleanProperty(PropertyKey.useCursorFetch).getValue()) {// assume server-side prepared statements are wanted because they're required for this functionalitysuper.<Boolean>getProperty(PropertyKey.useServerPrepStmts)
http://www.lryc.cn/news/482712.html

相关文章:

  • 如何在 Spring Boot 中利用 RocketMQ 实现批量消息消费
  • 推荐一个Star超过2K的.Net轻量级的CMS开源项目
  • 基于驾驶员面部特征的疲劳检测系统
  • 前端知识点---字符串的8种拼接方法(Javascript)
  • 用 Python 从零开始创建神经网络(一):编码我们的第一个神经元
  • 低代码开发
  • sql server 文件和文件组介绍
  • caozha-CEPCS(新冠肺炎疫情防控系统)
  • 1Panel修改PostgreSQL时区
  • 开发一个CRM系统难吗?CRM系统的实现步骤
  • kafka常见面试题总结
  • 前端知识点---Javascript中检测数据类型函数总结
  • aspose如何获取PPT放映页“切换”的“持续时间”值
  • 【MQTT】代理服务比较RabbitMQ、Mosquitto 和 EMQX
  • 【C#/C++】C++/CL中String^的含义和举例,C++层需要调用C#层对象时...
  • Python学习从0到1 day26 第三阶段 Spark ② 数据计算Ⅰ
  • 【详细】如何优雅地删除 Docker 容器与镜像
  • Spring Spring Boot 常用注解总结
  • Flink独立集群+Flink整合yarn
  • 动态规划 之 简单多状态 dp 问题 算法专题
  • qt QPixmapCache详解
  • Redis中的持久化
  • Unity 如何优雅的限定文本长度, 包含对特殊字符,汉字,数字的处理。实际的案例包括 用户昵称
  • SMO+PLL滑膜观测器、MARS模型参考自适应观测器simulink仿真
  • 例题解析:利用异或运算(XOR)找出单独的数
  • 如何处理微信小程序大量未捕获的异常
  • C#-StringBuilder
  • SQLI LABS | Less-39 GET-Stacked Query Injection-Intiger Based
  • linux安装zookeeper和kafka集群
  • 洞悉 Linux 系统运行细节,使用 atop 监测和回看系统负载状态