前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用MySQL Server Side Cursor解决查询数据量过大造成OOM

使用MySQL Server Side Cursor解决查询数据量过大造成OOM

作者头像
加多
发布2018-09-06 15:03:08
1.6K0
发布2018-09-06 15:03:08
举报
文章被收录于专栏:Java编程技术Java编程技术

一、前言

前面介绍了MyBaits中两种使用游标的方式来避免搜查内容过大导致OOM,这两种方式被称为是客户端side的游标,因为mysql client每次从自己的接受buffer获取一条记录,这虽然解决了OOM,但是会造成sqlserver服务器推送记录到client的时候阻塞,那么有没有一种方式可以让mysql server减少阻塞那,答案是肯定的。

二、MySQL Server Side Cursor

2.1 使用

要使用MySQL Server Side游标需要满足下面条件:

  • 必须是select语句
  • 设置了fetchSize>0 在mapper文件里面设置
  • 设置了useCursorFetch=true
  • 数据集类型为ResultSet.TYPE_FORWARD_ONLY
  • 数据集并发设置为ResultSet.CONCUR_READ_ONLY 在数据库链接后面设置:jdbc:mysql://localhost:3306/test?useCursorFetch=true"
  • Server versions 5.0.5 or newer

这是因为代码层面做了下面判断:

代码语言:javascript
复制
// we only create cursor-backed result sets if
// a) The query is a SELECT
// b) The server supports it
// c) We know it is forward-only (note this doesn't preclude updatable result sets)
// d) The user has set a fetch size
if (this.resultFields != null && this.useCursorFetch && getResultSetType() == ResultSet.TYPE_FORWARD_ONLY
        && getResultSetConcurrency() == ResultSet.CONCUR_READ_ONLY && getFetchSize() > 0) {
    packet.writeByte(OPEN_CURSOR_FLAG);
    //                  usingCursor = true;
} else {
    packet.writeByte((byte) 0); // placeholder for flags
}

2.2 原理简单介绍

先说下发送原理,client发送select请求给Server后,Server根据条件筛选符合条件的记录,然后就会把记录发送到自己的发送buffer,等buffer满了就flush缓存(这里要注意的是如果client的接受缓存满了,那么Server的发送就会阻塞主,直到client的接受缓存空闲。),通过网络发送到client的接受缓存,当不用游标时候MySqIo就会从接受缓存里面逐个读取记录到resultset。就这样client 从自己的接受缓存读取数据到resultset,同时Server端不断通过网络向client接受缓存发送数据,直到所有记录都放到了resultset。

服务器边的游标则是mysqlclient一次从自己的接受缓存读取fetchSize个记录(如果buffer不够fetchSize也没关系,因为Server一直在向这个buffer 刷新数据)。mysqlclient获取fetchSize个记录放到mysqlclient的游标内部的数组里面,游标获取的时候是从数组里面获取数据,如果数组为空了,在向buffer获取fetchSize个记录。

三、总结对比

服务器边的游标的使用的确可以减少server端阻塞,这是因为client一次从接受缓存读取fetchsize个记录,所以大概率情况下给Server写入腾出了空间。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.07.30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言
  • 二、MySQL Server Side Cursor
    • 2.1 使用
      • 2.2 原理简单介绍
      • 三、总结对比
      相关产品与服务
      云数据库 SQL Server
      腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档